我正在使用Python和Git-Python编写git post-receive钩子,它可以收集有关推送中提交的信息,然后更新我们的bug跟踪器和即时通讯工具并提供一个摘要。但当一次推送创建了一个新分支(即post-receive的fromrev参数为全零),且该分支跨越多个提交时,我遇到了麻烦。我在从torev提交开始向父提交列表反向遍历,但是我无法确定哪个提交是该分支中的第一个提交,也就是何时停止查找。
在命令行上,我可以执行以下操作:
在命令行上,我可以执行以下操作:
git rev-list this-branch ^not-that-branch ^master
我希望能够准确地获取this-branch
中的提交列表,而不包括其他分支的提交。我已经尝试使用Commit.iter_parents
方法来复制这个功能,但是该方法似乎不支持位置参数,我也找不到一组可用的关键字参数。
我阅读了Dulwich的文档,但并不清楚它是否与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
git log master..branch --oneline | tail -1
,只需要弄清楚如何将其转换为代码即可 :P - starking