如何列出所有轻量级标签?

问题描述 投票:0回答:5

我想列出我的存储库中的所有轻量级标签;我能想到的最好的方法是结合

git for-each-ref
grep
cut
,但看起来有点麻烦......

(当我们讨论这个问题时,我们不妨就带注释的标签讨论同样的事情:在某些时候肯定有人会在这里想知道这一点。)

编辑:

通过

lightweight
标签,我的意思是那些引用标签对象的标签引用。 (换句话说,就是未注释的标签。)

git git-tag
5个回答
29
投票

所有轻量级标签都在

refs/tags/
命名空间中,可以通过以下方式枚举,例如:

git for-each-ref --format '%(refname:short)' refs/tags/

或:

git show-ref --tags

对于带注释的标签,这里的技巧——它也影响“轻量级”标签部分——是带注释的标签实际上是 git 存储库中的一个对象,但是,有一个轻量级标签指向对象,它允许您通过标签名称获取带注释的标签。1 所以它实际上是一对:一个轻量级标签,加上存储库内带注释的标签对象,这使得它“不是一个轻量级标签” ,除了一个顽固的事实:它同时是一个轻量级标签!

因此,它归结为:找到

all轻量级标签,然后根据您想要的行为仅选择指向提交的标签或指向标签对象的标签,然后继续发出标签名称。

git-for-each-ref

文档中有一个很长的示例,在
--format
字符串中编写整个脚本并使用
eval
来执行它(或者您可以通过管道传输到
sh
来执行,但需要一个额外的进程) 。我通常发现将 
git for-each-ref
 的输出通过管道传输到 
while read ...
 循环中更简单:

git for-each-ref refs/tags/ --format '%(objecttype) %(refname:short)' | while read ty name; do [ $ty = commit ] && echo $name; done

打印所有

仅轻量级标签。

比较:

git for-each-ref refs/tags/ --format '%(objecttype) %(refname:short)' | while read ty name; do [ $ty = tag ] && echo $name; done

打印所有

注释标签(或更准确地说,“轻量级注释”标签)。

请注意,标签可以(据我所知,可以想象,目前没有实际的用例)指向提交或标签之外的其他内容;由您决定是否使用直接指向

tree

blob
 的标签执行某些操作。


1如果没有轻量级标签,您将无法使用名称 annotag

 来引用带注释的标签 
annotag
,至少需要经历 
git fsck
 用于查找悬挂对象的所有搜索工作。此外,如果删除轻量级标签,带注释的标签对象可能会被垃圾收集。您可以使一个标签对象指向另一个标签对象,以将其保留在存储库中(即禁止 gc),而无需第二个标签对象的外部名称,只要第一个标签对象具有外部名称即可。但这绝对是一件奇怪的事情。

有趣的是,带注释的标签的内部格式包含外部名称,因此可以使用此技术来保护“旧”带注释的标签,通过删除其轻量级标签来隐藏它们,然后恢复原始的轻量级标签。不过,是否有人能为此想出一个

use……:-)


10
投票
仅列出

轻量级标签:

git for-each-ref refs/tags | grep commit
仅列出

带注释的标签:

git for-each-ref refs/tags | grep -v commit
说明:

git for-each-ref

列出了所有参考:
headsremotesstashtags

git for-each-ref refs/tags

仅列出
标签参考。

| grep commit

 仅列出包含单词 
commit 的行。这些是指向提交的标签,因此是轻量级标签。

| grep -v commit

 仅列出那些不包含单词 
commit 的行。这些是指向标签的标签,因此是带注释的标签。


1
投票
总结其他答案及其评论,如果您使用的是 bash:

function git-lightweight-tags() { git for-each-ref refs/tags/ --format '%(objecttype) %(refname:short)' | awk '$1 == "commit" {print $2}' ; }
    

0
投票
请注意,您还可以标记(轻量级和带注释的)斑点和树。

因此

git for-each-ref refs/tags | grep -v commit

不仅会列出带注释的标签,还会列出斑点和树的标签。

我建议对“标签”一词使用 grep 来查找带注释的标签:

git for-each-ref refs/tags | grep -w tag

.

不要忘记

-w

,否则你会发现子字符串
tag
也适用于轻量级标签。


0
投票
使用

git for-each-ref

awk

带注释的标签

git for-each-ref refs/tags | awk '$2~/tag/{print $3}'
轻量级标签

git for-each-ref refs/tags | awk '$2~/commit/{print $3}'
第一个字段是哈希值,第二个字段是类型,第三个字段是引用的名称

© www.soinside.com 2019 - 2024. All rights reserved.