Python と Git-Python を使用して、プッシュに含まれるコミットに関する情報を収集し、バグ トラッカーと IM を要約で更新する git post-receive フックを作成しています。プッシュがブランチを作成し (つまり、fromrev
post-receive へのパラメーターがすべてゼロである)、そのブランチで複数のコミットにまたがる場合に問題が発生します。親のリストをコミットからさかのぼって歩いていますが、torev
どのコミットがブランチの最初のコミットであるか、つまりいつ見るのをやめるべきかを判断する方法がわかりません。
コマンドラインでできること
git rev-list this-branch ^not-that-branch ^master
これにより、 のコミットのリストが正確に表示されthis-branch
、他には表示されません。git-rev-list と同じパラメーターを取るように文書化されている方法を使用してこれを複製しようとしましたCommit.iter_parents
が、私が見る限り位置パラメーターが好きではなく、キーワードパラメーターのセットが見つかりませんその仕事。
Dulwich の doco を読みましたが、Git-Python と非常に異なることを行うかどうかは明確ではありませんでした。
私の(簡略化された)コードは次のようになります。プッシュが新しいブランチを開始すると、現在、最初のコミットのみを見て停止します。
import git
repo = git.Repo('.')
for line in input:
(fromrev, torev, refname) = line.rstrip().split(' ')
commit = repo.commit(torev)
maxdepth = 25 # just so we don't go too far back in the tree
if fromrev == ('0' * 40):
maxdepth = 1
depth = 0
while depth < maxdepth:
if commit.hexsha == fromrev:
# Reached the start of the push
break
print '{sha} by {name}: {msg}'.format(
sha = commit.hexsha[:7], user = commit.author.name, commit.summary)
commit = commit.parents[0]
depth += 1