使用Python dulwich检查哪些分支包含特定的git提交sha?
我想在Python脚本中使用dulwich来执行以下命令:
$ git branch --contains <myCommitSha> | wc -l
我的目的是检查一个特定的提交(sha)是否出现在多个分支中。
当然,我考虑过可以从Python执行上面的命令,然后解析输出(也就是解析分支的数量),但那是最后的办法。
还有其他想法或评论吗?提前谢谢大家。
4 个回答
2
因为分支其实就是指向某个随机提交的指针,它们并不以任何方式“描述”树,所以没有什么东西把某个随机提交和一个分支联系起来。
我认为,检查某个提交是否是某个分支指向的提交的祖先,最合理的方法就是从分支的顶端提交开始,向下遍历所有的祖先链。
换句话说,在dulwich中,我会遍历所有分支,然后向后查找,看看某个sha是否在这条链上。
我很确定这正是git branch --contains <myCommitSha>
所做的,因为我不知道还有其他的快捷方式。
既然你的选择是(a)让python来做这个遍历,或者(b)让C来做同样的遍历,我会选择C。:)
8
如果有人想知道现在如何使用gitpython来做到这一点:
repo.git.branch('--contains', YOURSHA)
1
这个功能没有现成的函数,但你当然可以自己实现。
你也可以试试这样做(没测试过):
branches = [ref for ref in repo.refs.keys("refs/heads/") if
any((True for commit in repo.get_walker(include=[repo.refs[ref]])
if commit.id == YOURSHA))]
这样做会给你一个包含指定提交的所有分支头的列表,但运行时间是 O(n*m),其中 n 是你仓库里的提交数量,m 是分支的数量。而 Git 自己的实现可能运行时间是 O(n)。