确定Git存储库是否包含特定提交

时间:2010-08-17 19:16:32

标签: git commit contains

我想确定远程git存储库(origin)是否包含特定的提交。我的用例如下:

我正准备创建公开发布。我想要包含代表我正在构建发行版的原始代码库的提交的SHA-1。

我还想确保提交不仅仅是本地提交,而且实际上它已被推送到中央存储库(origin)。

我认为


git pull --all & git branch --contains commit-hash

然后检查输出以查看它是否包含当前分支的跟踪分支,有效,但看起来相当麻烦。我正在寻找一些更简洁的内容,例如git remote --contains origin commit-hashgit cat-file origin commit-hash。我认为在确定推送或拉动过程中需要传输哪些对象时,Git必须使用一些管道命令 - 我对内部构件不够熟悉。

感谢您的帮助。

4 个答案:

答案 0 :(得分:5)

如何:git fetch && git branch -r --contains <commit-id>

答案 1 :(得分:5)

我可能也忽略了一些管道,但据我所知,测试commitA是commitB的祖先的最直接方法是检查git merge-base commitA commitB是否为commitA。首先获取,然后因为它们可能是分支,使用rev-parse为commitA获取SHA1:

if [ "$(git rev-parse $commitA)" == "$(git merge-base $commitA $commitB)" ]; then ...; else ...; fi

用别名包裹它,你应该设置它。

至于在push和fetch(pull)期间,这些是用C实现的,所以它们不会直接调用任何暴露的管道命令。

答案 2 :(得分:0)

git fetch + git branch -r是您可以获得的最佳效果。

您可以破解git protocol来提供此结果,但是没有可以使用afaik的管道。详情请参阅第5节。只需破解“have”命令并检查服务器是否为NAK。

更简单的黑客只是尝试推送该提交,看看服务器是否需要它。

答案 3 :(得分:0)

可以从正在审核但尚未合并的gerrit分支中看到吗?取了之后,     git branch --all --contains 将列出所有分支,但审核页面上的提交不会显示。