如何在git中列出指向特定提交的所有标签


81

我已经看到了命令git describegit-name-rev但是我没有设法使它们列出多个标签。

示例:我有sha1 48eb354,并且我知道标签A和B指向它。所以我想要一个git命令git {something} 48eb354,产生类似于“ A,B”的输出。我对了解相对于其他标签或分支的引用完全不感兴趣,只是这些标签的完全匹配。

Answers:


45

git show-ref --tags -d | grep ^48eb354 | sed -e 's,.* refs/tags/,,' -e 's/\^{}//'

应该适用于轻量级标签和带注释的标签。


谢谢。正是我想要的。
mrutyunjay 2013年

这对于git <1.7.10非常有效。您能解释sed表达式的第二部分做什么吗?-e 's/\^{}//'
戴夫

啊,没关系,想通了。用于上的-d选项git show-ref。在文档中,“ -d,--dereference也将取消引用标记插入对象ID。它们将显示为附加了“ ^ {}”。”
戴夫

1
使用任意${ref}hash=$(git rev-parse "${ref}^0"); git show-ref --tags -d | sed -n -e 's,^'"${hash}"' refs/tags/\(.*\)^{}$',\1,p'
符号


50

您可以使用:

git tag --contains <commit>

显示特定提交时的所有标签。它可以代替:

git tag --points-at HEAD

仅从1.7.10起可用。


10
注意:“ git tag --contains”不仅显示指向提交的标签,还包括以后可以访问的所有标签。
staafl

至少在版本2.6.4中,这仅返回指向指定提交的单个标记。它并不能全部返回。@max的上述答案似乎可以在多个标签上正常使用。
Dejay Clayton

--contains似乎也比--points-at(7-8s执行时间vs <1s)慢得多
SSilk

4
git for-each-ref --format='%(objectname) %(refname:short)' refs/tags/ |
  grep ^$commit_id |
    cut -d' ' -f2

可惜这不容易做到。另一个git tag包含提交ID的标志可以git for-each-ref自然地表达该调用。


1
感谢您提供的信息,但我似乎也无法使用此命令查看标签。使用更简单的“ git for-each-ref | grep 48eb354”给出0个匹配项。另一方面,gitk很好地在此提交之前列出了2个标签。
Zitrax

1

以下命令可以完成此工作,但直接解析.git目录的内容,因此如果git存储库格式更改,则可能会中断。

grep -l -r -e '^48eb354' .git/refs/tags|sed -e 's,.*/,,'

也不列出它们,如果grepping整个.git文件夹,我唯一看到sha1的地方是gitk.cache和logs / refs / remotes / origin / master中。gitk怎么列出它们?我还注意到,我正在查看的标签是带注释的标签,这可能就是为什么两个当前答案对我不起作用的原因。
Zitrax 2010年

1

对于当前提交,您可以使用

git tag --points-at $(git log -n1 --pretty='%H')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.