我想在我的存储库中列出所有轻量级标签; 我能想到的最好的东西包括结合git for-each-ref
,grep
和cut
,但似乎它会有点狡猾......
(虽然我们正在谈论它,但我们不妨谈论注释标签的相同事情:有人肯定会在某处对此感到疑惑.)
编辑:
通过lightweight
标签,我的意思是那些不引用标签对象的标签引用.(换句话说,未注释的标签.)
所有轻量级标记都在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
-not 引用带注释的标记,而无需经历git fsck
用于查找悬空对象的所有搜索工作,至少.此外,如果删除轻量级标记,则带注释的标记对象可能会被垃圾收集.只要第一个标记对象具有外部名称,就可以使一个标记对象指向另一个标记对象,以使其保留在repo中(即禁止gc),而无需第二个标记对象的外部名称.尽管如此,这绝对是一件奇怪的事情.
有趣的是,带注释的标签的内部格式包含外部名称,因此可以使用此技术来保护"旧的"带注释的标签,通过删除它们的轻量级标签来隐藏它们,然后再恢复原始的轻量级标签.无论任何人都可以想出利用这一点,虽然... :-)