我想确定远程git存储库(origin)是否包含特定的提交。我的用例如下:
我正准备创建公开发布。我想要包含代表我正在构建发行版的原始代码库的提交的SHA-1。
我还想确保提交不仅仅是本地提交,而且实际上它已被推送到中央存储库(origin)。
我认为
git pull --all & git branch --contains commit-hash
然后检查输出以查看它是否包含当前分支的跟踪分支,有效,但看起来相当麻烦。我正在寻找一些更简洁的内容,例如git remote --contains origin commit-hash
或git cat-file origin commit-hash
。我认为在确定推送或拉动过程中需要传输哪些对象时,Git必须使用一些管道命令 - 我对内部构件不够熟悉。
感谢您的帮助。
答案 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 将列出所有分支,但审核页面上的提交不会显示。