我已经看到了命令git describe
,git-name-rev
但是我没有设法使它们列出多个标签。
示例:我有sha1 48eb354,并且我知道标签A和B指向它。所以我想要一个git命令git {something} 48eb354
,产生类似于“ A,B”的输出。我对了解相对于其他标签或分支的引用完全不感兴趣,只是这些标签的完全匹配。
Answers:
git show-ref --tags -d | grep ^48eb354 | sed -e 's,.* refs/tags/,,' -e 's/\^{}//'
应该适用于轻量级标签和带注释的标签。
-e 's/\^{}//'
-d
选项git show-ref
。在文档中,“ -d,--dereference也将取消引用标记插入对象ID。它们将显示为附加了“ ^ {}”。”
${ref}
hash=$(git rev-parse "${ref}^0"); git show-ref --tags -d | sed -n -e 's,^'"${hash}"' refs/tags/\(.*\)^{}$',\1,p'
git tag --points-at HEAD
在HEAD上显示所有标签,您也可以将HEAD替换为任何sha1 id。
您可以使用:
git tag --contains <commit>
显示特定提交时的所有标签。它可以代替:
git tag --points-at HEAD
仅从1.7.10起可用。
--contains
似乎也比--points-at
(7-8s执行时间vs <1s)慢得多
git for-each-ref --format='%(objectname) %(refname:short)' refs/tags/ |
grep ^$commit_id |
cut -d' ' -f2
可惜这不容易做到。另一个git tag
包含提交ID的标志可以git for-each-ref
自然地表达该调用。
以下命令可以完成此工作,但直接解析.git目录的内容,因此如果git存储库格式更改,则可能会中断。
grep -l -r -e '^48eb354' .git/refs/tags|sed -e 's,.*/,,'