【发布时间】:2011-09-03 17:26:14
【问题描述】:
我在本地分支中有一个提交 xyz,我想检查它是否包含在远程发布存储库中;我可以用一些简单的方法做到这一点吗?我可以克隆远程仓库,但我希望有一个更好+更快的方式。 git ls-remote 看起来很有希望,但在那里没有发现对我有价值的东西。谢谢!
【问题讨论】:
标签: git
我在本地分支中有一个提交 xyz,我想检查它是否包含在远程发布存储库中;我可以用一些简单的方法做到这一点吗?我可以克隆远程仓库,但我希望有一个更好+更快的方式。 git ls-remote 看起来很有希望,但在那里没有发现对我有价值的东西。谢谢!
【问题讨论】:
标签: git
现有答案要求在本地下载整个远程存储库。如果远程有许多尚未在本地克隆的提交,这可能需要很长时间。例如 linux-stable 存储库,它有许多从未合并的独立分支。跟踪a 稳定内核的人可能只克隆该内核的单个分支。需要为每个稳定系列内核获取所有分支,以查看提交是否存在将需要下载更多数据。
如果不获取整个远程仓库,似乎没有一个好方法可以做到这一点。根据git fetch-pack 和git send-pack 的工作方式,这种能力是存在的,但似乎没有一种方法可以以所需的方式使用它。
将分支推送到远程存储库不会上传远程已经拥有的提交,并且无需先下载整个远程存储库即可完成此操作。尝试获取远程提交不需要下载整个远程存储库来确定请求的提交是否存在。
后者可用于在某些情况下实现所要求的。
git fetch origin <commit ID>
如果远程没有那个提交,那么这将失败。远程存储库不需要在本地克隆即可。如果远程确实有提交,那么它会获取它。没有选择只是查看获取是否可以工作但不获取任何内容。当然,如果提交已经在本地可用,则不需要获取任何内容,这不是一个昂贵的操作。
某些远程存储库不允许请求不是分支头或标签的内容。在这种情况下,这是行不通的。
【讨论】:
就像马克说的,
git branch -a --contains commitish
但是,请注意包含精心挑选/重新建立/合并版本的提交的分支。
这可能会派上用场
git log --cherry-pick --left-right <commitish> ^remote/branchname
如果它在远程分支中不存在(作为一个cherrypick),它将列出提交ONLY。有关 --cherry-pick 如何识别等效提交的说明,请参阅日志手册页
当然,不能像这样自动检测具有冲突解决或压缩的合并/变基
【讨论】:
cherry-pick) 仅在提交内容相等(除了空格)时才有效,例如在挑选樱桃时,情况不一定如此。
假设引用远程存储库的远程称为origin。在这种情况下,首先更新所有远程跟踪分支:
git fetch origin
现在您可以使用git branch 的有用--contains 选项来找出哪个远程分支包含该提交:
git branch -r --contains xyz
(-r 表示仅显示远程跟踪分支。)如果提交 xyz 包含在您的一个或多个远程跟踪分支中,您将看到如下输出:
origin/test-suite
origin/HEAD -> origin/master
origin/master
如果它包含在您的本地存储库中,但不是远程跟踪分支之一,则输出将为空。但是,如果您的存储库中根本不知道该提交,您将收到错误 malformed object name 和使用消息 - 如果您不期待它,可能会有点混乱......
【讨论】:
git for-each-ref 遍历远程跟踪分支,并通过检查git merge-base <YOUR-COMMIT> <BRANCH> 是否与<YOUR-COMMIT> 相同来测试提交是否包含在每个分支中。
git gc,然后 git branch -r --contains xyz 才能有效运行。