我想使用德威从Python脚本执行以下命令:
$ git branch --contains <myCommitSha> | wc -l
我的目的是检查特定提交 (sha) 是否放置在多个分支中。
当然,我认为我可以从 Python 执行上述命令并解析输出(解析分支数量),但这是最后的手段。
还有其他想法/意见吗?提前谢谢。
以防万一有人想知道现在如何使用 gitpython 来做到这一点:
repo.git.branch('--contains', YOURSHA)
由于分支只是指向随机提交的指针,并且它们不会以任何方式"描述"树,因此没有任何内容将随机提交链接到分支。
查找给定提交是否是某些分支指向的提交的祖先的唯一明智方法是从分支顶部提交向下遍历所有祖先链。
换句话说,在德威,我会遍历树枝并向后移动,看看链条上是否有沙。
我相当确定这正是git branch --contains <myCommitSha>
所做的,因为我不知道任何其他捷径。
由于你的选择是(a)让python做迭代或(b)让C做同样的迭代,我就用C:)。
这没有内置函数,但你当然可以自己实现。
你也可以做这样的事情(未经测试):
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)。
以防有人使用 GitPython 并想要所有分支
import git
gLocal = git.Git("<LocalRepoLocation>")
gLocal.branch('-a','--contains', '<CommitSHA>').split('n')