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

我想列出我的资源库中的所有轻量级标签; 我能想到的最好的方法就是将git for-each-refgrepcut结合起来,但它看起来好像很费劲......

(当我们谈论它的时候,我们不妨谈论标注标签的同样的事情:某人肯定最终会在这里想到这个问题。)

编辑:

通过lightweight标签,我指的是那些不涉及标签对象的标签参考。 (换句话说,没有注释的标签。)


所有的轻量级标签都在refs/tags/ namespace中,可以枚举,例如:

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

要么:

git show-ref --tags

至于注释标签,好吧,这里的技巧 - 它也会影响“轻量级”标签 - 注释标签实际上是git存储库中的一个对象,但是,有一个指向该对象的轻量级标签,可以让您通过它的标签名称来获取带注释的标签.1因此,它实际上是一对事物:一个轻量级标签,以及in-repo带注释的标签对象,这使得它“不是一个轻量级标签”,除了那个顽固的事实一个轻量级的标签在同一时间!

因此,它归结为:找到所有轻量级标签,然后根据您想要的行为选择仅选择指向提交或标签指向标签对象的标签,然后继续发出标签名称。

还有的在相当长的例子git-for-each-ref在写一个整个脚本的文件--format字符串和使用eval执行它(或者你可以管sh来执行,在一个额外的处理成本)。 我通常会发现,将git for-each-ref的输出放入一段while read ...会更简单while read ... loop:

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

它打印所有带注释的标签(或者更准确地说,是“标注的轻量级”标签)。

请注意,标签可以(可以想象 - 就我所知,目前没有实际用例)指向除提交或标签之外的其他东西; 是否使用直接指向treeblob的标签来做某件事取决于您。


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

有趣的是,注释标签的内部格式包含外部名称,因此可以使用此技术保护“旧”注释标签,通过移除轻量级标签来隐藏它们,然后再恢复原始轻量级标签。 是否任何人都可以拿出这个用途,虽然...... :-)

链接地址: http://www.djcxy.com/p/27123.html

上一篇: How can I list all lightweight tags?

下一篇: a flag to the git tag command?