如何列出包含特定存储库上给定提交的分支?

How to list branches that contain a given commit on a specific repository?

所以我阅读了 Git: How to find out on which branch tag is? 和许多其他帖子并且我已经知道如何使用: git branch --contains tag

但是,我仍然需要知道如何在特定存储库中列出包含给定提交(或标记)的分支

背景

我使用以下方法从远程存储库 archive 中提取了标签列表:

git ls-remote --tags archive

现在,对于提取的每个标签,我希望获得包含分支的列表。 使用命令: git branch --contains tag 没有帮助,因为找不到标签,因为它们不存在于 origin 存储库中。

考虑到您声明的限制条件(具体来说,您有从 tag-name 到 SHA-1 ID 的映射并且根本没有其他信息),您无法得到您想要的。

谓词定义:

branch name contains commit id

只是 idname[=34= 的 SHA-1 的祖先1 ] 地图。要测试此命题,您必须能够遍历该图,从 name 映射到的节点开始,然后遍历图中的所有路径,直到您 运行 出节点数,或者遇到给定的 id.

不过,要遍历该图,您必须拥有该图。

这意味着只有两种方法可以找到答案:自己拥有图表,或者找一些拥有图表的实体来为您解答问题。 git 和 git 服务器没有内置任何内容来执行后者(尽管有些服务器可能会提供 add-on)。

另一方面,如果你可以运行 git ls-remote,你也可以检索存储库,因此你可以自己回答这个问题(当然是以检索存储库为代价的).


1为了这个定义的目的,一个节点是它自己的祖先。在这种特殊的退化情况下(标记和分支的提示匹配),当然,您可以通过查看分支提示的 SHA-1 ID 立即回答问题,这些值可通过 git ls-remote.

需要git branch--all--containscommit才能看到来自其他遥控器的分支。

这仍然取决于您从它们所在的任何远程获取要检查的提交 - git fetch archive 在您的情况下。

没有它,您的本地存储库就没有提交,而且几乎什么也做不了。例如,如果没有提交,你不能 git log 等。有各种各样的 (semi-working) 解决方法,比如通过 SSH 连接到服务器并对其进行处理(如果可用)或使用各种 Web API(GitHub、Stash)(如果可用),但基本上你需要提交提交。 git ls-remote 是一个例外,它可以在远程存储库上工作而无需本地任何东西。