我想列出我的存储库中的所有轻量级标签;我能想到的最好方法是将git for-each-ref
、grep
和cut
组合在一起,但这似乎有点费劲……
(当我们讨论这个问题时,我们不妨讨论一下注释标签的相同之处:一定有人会在这里对这个问题产生疑问。)
编辑:
我指的是那些不引用标记对象的标记引用。(换句话说,未标记的标签。)
最佳答案
所有轻量级标记都在refs/tags/
命名空间中,可以使用枚举,例如:
git for-each-ref --format '%(refname:short)' refs/tags/
或:
git show-ref --tags
至于带注释的标记,这里的技巧也会影响到“轻量级”标记部分,即带注释的标记实际上是Git存储库中的一个对象,但有一个轻量级标记指向该对象,它允许您通过标记名来获取带注释的标记。1因此它实际上是一对重要的是:一个轻量级的标签,再加上内置的带注释的标签对象,使得它“不是轻量级的标签”,除了一个顽固的事实,即它同时也是轻量级的标签!
因此,可以归结为:查找所有轻量级标记,然后根据需要的行为选择只指向提交的标记或指向标记对象的标记,然后继续发出标记名称。
在
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
。此外,如果删除轻量级标记,带注释的标记对象可能会被垃圾收集。您可以使一个标记对象指向另一个标记对象,以将其保留在repo中(即,禁止gc),而不使用第二个标记对象的外部名称,只要第一个对象具有外部名称。不过,这绝对是件奇怪的事情。有趣的是,带注释的标记的内部格式包含外部名称,因此可以使用此技术来保护“旧”带注释的标记,通过删除它们的轻量级标记来隐藏它们,然后恢复原始的轻量级标记。不过,是否有人能想出一个使用这个的办法…-)