2010-08-17 88 views
4

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

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

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

我觉得

 

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

,然后检查输出,看它是否包含当前分支的跟踪科,工,但似乎相当繁琐。我正在寻找一些更简洁的内容,如git remote --contains origin commit-hashgit cat-file origin commit-hash。我认为当确定在推或拉期间需要传输哪些对象时,Git需要使用一些管道命令 - 我对内部组件并不熟悉。

感谢您的帮助。

回答

5

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

+1

嗯......我忽略了-r选项。这会起作用,但我仍然认为必须有一些管道命令,我错过了。实际上,我不关心当前分支的跟踪分支是否包含提交。我只关心提交是否存在,而不考虑它可以访问哪个分支。 – Josh 2010-08-17 22:53:19

+0

@Josh:当然,如果这是一个公开发行版,你确实关心它的分支 - 它应该在分支上发布。 – Cascabel 2010-08-18 02:53:33

+0

因为它是一个脚本,最好使用管道等效物:'git merge-base --is-ancestor ' – JaviMerino 2016-05-16 18:07:08

5

我可能忽略了一些管道太多,但据我所知,测试最直接的方式,如果commitA是commitB的祖先是检查是否git merge-base commitA commitBcommitA。取第一,然后因为它们可能是树枝,用REV-解析得到一个SHA1为commitA:

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

总结,最多的一个别名,你应该设置。

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

0

git fetch + git branch -r是最好的,你可以得到。

你可以破解git protocol来给出这个结果,但是没有管道可以使用afaik。详情请参阅第5节。只需破解“有”命令并检查服务器NAK。

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

0

它可以从正在审查但尚未合并的gerrit分支中看到吗?取回之后, git branch --all --contains 将列出所有分支,但未提供审阅页上的提交。

相关问题