【问题标题】:git: check if commit xyz in remote repo?git:检查是否在远程仓库中提交 xyz?
【发布时间】:2011-09-03 17:26:14
【问题描述】:

我在本地分支中有一个提交 xyz,我想检查它是否包含在远程发布存储库中;我可以用一些简单的方法做到这一点吗?我可以克隆远程仓库,但我希望有一个更好+更快的方式。 git ls-remote 看起来很有希望,但在那里没有发现对我有价值的东西。谢谢!

【问题讨论】:

标签: git


【解决方案1】:

现有答案要求在本地下载整个远程存储库。如果远程有许多尚未在本地克隆的提交,这可能需要很长时间。例如 linux-stable 存储库,它有许多从未合并的独立分支。跟踪a 稳定内核的人可能只克隆该内核的单个分支。需要为每个稳定系列内核获取所有分支,以查看提交是否存在将需要下载更多数据。

如果不获取整个远程仓库,似乎没有一个好方法可以做到这一点。根据git fetch-packgit send-pack 的工作方式,这种能力是存在的,但似乎没有一种方法可以以所需的方式使用它。

将分支推送到远程存储库不会上传远程已经拥有的提交,并且无需先下载整个远程存储库即可完成此操作。尝试获取远程提交不需要下载整个远程存储库来确定请求的提交是否存在。

后者可用于在某些情况下实现所要求的。

git fetch origin <commit ID>

如果远程没有那个提交,那么这将失败。远程存储库不需要在本地克隆即可。如果远程确实有提交,那么它会获取它。没有选择只是查看获取是否可以工作但不获取任何内容。当然,如果提交已经在本地可用,则不需要获取任何内容,这不是一个昂贵的操作。

某些远程存储库不允许请求不是分支头或标签的内容。在这种情况下,这是行不通的。

【讨论】:

  • 不幸的是,如果您已经在本地拥有提交修订的副本,这似乎不起作用。 git fetch 只会获取本地仓库副本中缺失的提交。
【解决方案2】:

就像马克说的,

 git branch -a --contains commitish

但是,请注意包含精心挑选/重新建立/合并版本的提交的分支。

这可能会派上用场

 git log --cherry-pick --left-right <commitish> ^remote/branchname

如果它在远程分支中不存在(作为一个cherrypick),它将列出提交ONLY。有关 --cherry-pick 如何识别等效提交的说明,请参阅日志手册页

当然,不能像这样自动检测具有冲突解决或压缩的合并/变基

【讨论】:

  • 第二行 (cherry-pick) 仅在提交内容相等(除了空格)时才有效,例如在挑选樱桃时,情况不一定如此。
  • @hoijui 我希望空格很重要。挑选樱桃时,您会期望更改集是相同的,除非有手动编辑(例如,存在合并冲突)。但是,是的,樱桃挑选检测是有限的。日常使用还是很不错的
  • 是的,我觉得它也很好,我只是想在这里说明一下,因为我尝试过并且巧合的是我偶然发现了这个问题,并花了很多时间找出为什么我的樱桃挑选检测不起作用。原始提交更改了 3 行,其中一个已经由另一个提交完成,因此没有任何冲突,cherry-pick 只剩下两行。 -> 不是批评,只是一个有用的提示。
【解决方案3】:

假设引用远程存储库的远程称为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 管道做到这一点?
  • @dpk:我可能会使用git for-each-ref 遍历远程跟踪分支,并通过检查git merge-base &lt;YOUR-COMMIT&gt; &lt;BRANCH&gt; 是否与&lt;YOUR-COMMIT&gt; 相同来测试提交是否包含在每个分支中。
  • github.com/git/git/commit/… (github.com/git/git/commit/…) 将避免错误信息和使用信息。但仅适用于 Git 2.18(2018 年第二季度)
  • 在一个大型 repo 的新克隆上,我还必须运行 git gc,然后 git branch -r --contains xyz 才能有效运行。
猜你喜欢
  • 2016-05-11
  • 2011-03-01
  • 1970-01-01
  • 2019-01-18
  • 2020-06-12
  • 2017-01-18
  • 1970-01-01
相关资源
最近更新 更多