【发布时间】:2011-05-31 12:43:15
【问题描述】:
我已经看到命令git describe 和git-name-rev,但我没有设法让它们列出多个标签。
示例:我有 sha1 48eb354,我知道标签 A 和 B 指向它。所以我想要一个 git 命令git {something} 48eb354 产生类似于“A,B”的输出。我不想知道与其他标签或分支相关的引用只是标签的完全匹配。
【问题讨论】:
我已经看到命令git describe 和git-name-rev,但我没有设法让它们列出多个标签。
示例:我有 sha1 48eb354,我知道标签 A 和 B 指向它。所以我想要一个 git 命令git {something} 48eb354 产生类似于“A,B”的输出。我不想知道与其他标签或分支相关的引用只是标签的完全匹配。
【问题讨论】:
对于当前提交,您可以使用
git tag --points-at $(git log -n1 --pretty='%H')
【讨论】:
HEAD 而不是$(git log -n1 --pretty='%H')
你可以使用:
git tag --contains <commit>
显示特定提交时的所有标签。 它可以用来代替:
git tag --points-at HEAD
仅从 1.7.10 开始可用。
【讨论】:
--contains 也比--points-at 慢得多(7-8s 执行时间 vs
git tag --points-at HEAD
在 HEAD 处显示所有标签,您也可以将 HEAD 替换为任何 sha1 id。
【讨论】:
git show-ref --tags -d | grep ^48eb354 | sed -e 's,.* refs/tags/,,' -e 's/\^{}//'
应该适用于轻量级和带注释的标签。
【讨论】:
git show-ref 上的-d 选项。从文档中,“-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 目录的内容,因此如果 git 存储库格式更改可能会中断。
grep -l -r -e '^48eb354' .git/refs/tags|sed -e 's,.*/,,'
【讨论】:
@987654321@ --format='%(objectname) %(refname:short)' refs/tags/ |
grep ^$commit_id |
cut -d' ' -f2
可惜不能更轻松地完成。 git tag 上包含提交 ID 的另一个标志可以自然地表达 git for-each-ref 调用。
【讨论】: