如何列出远程上引用提交或其后代之一的所有标签?

How to list all the tags, on a remote, that reference a commit or one of its descendants?

如何列出远程上引用提交或其后代之一的所有标签?

我正在寻找等同于 git branch -r --contains <commit> 的内容,但仅适用于远程标签。

据我所知,没有 "remote" 标签这样的东西。也就是说,您无法区分仅在本地拥有的标签和在远程也存在或仅存在的标签。

我还没有找到一个命令可以得到这个结果,但是这个过程可以解决这个问题。考虑 ref_sha 是您要查找引用它的远程标记或其后代之一的提交的哈希值。

可以使用以下命令列出遥控器上存在的标签。

git ls-remote --tags

输出的每一行代表一个标签。一行以指向对象的散列开头,然后是标记路径。如果标签指向带注释的标签对象,则会添加第二行。标记路径后跟 ^{},哈希将是通过递归取消引用上一行的哈希而获得的对象的哈希。

现在,我们需要获取数据,因为我们需要执行祖先检查。

git fetch

现在,对于第一步中列出的每个标签,我们需要使用以下命令进行祖先检查。设 rem_sha 为标签指向的散列。如果标签指向标签对象,您可以使用该散列或递归解除引用的对象散列。如果您向命令提供带注释的标签对象的哈希值,git 将自动递归取消引用该标签。

git merge-base --is-ancestor <ref_sha> <rem_sha>

当这个returns为0时,表示rem_sharef_sha或者一个它的后代(相当于:ref_sharem_sha 或祖先)。

注意:我们不能简单地在抓取后检查本地标签,因为可能还有本地标签还没有推送。