使用Python dulwich检查哪些分支包含特定的git提交sha?

0 投票
4 回答
3684 浏览
提问于 2025-04-17 13:37

我想在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)

撰写回答