我想列出我的存储库中的所有轻量级标签;我能想到的最好的方法是结合
git for-each-ref
、grep
和 cut
,但看起来有点麻烦......
(当我们讨论这个问题时,我们不妨就带注释的标签讨论同样的事情:在某些时候肯定有人会在这里想知道这一点。)
编辑:
通过
lightweight
标签,我的意思是那些不引用标签对象的标签引用。 (换句话说,就是未注释的标签。)
所有轻量级标签都在
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……:-)
轻量级标签:
git for-each-ref refs/tags | grep commit
仅列出带注释的标签:
git for-each-ref refs/tags | grep -v commit
说明:
git for-each-ref
列出了所有参考:heads、remotes、stash和tags
git for-each-ref refs/tags
仅列出标签参考。
| grep commit
仅列出包含单词commit 的行。这些是指向提交的标签,因此是轻量级标签。
| grep -v commit
仅列出那些不包含单词commit 的行。这些是指向标签的标签,因此是带注释的标签。
function git-lightweight-tags() {
git for-each-ref refs/tags/ --format '%(objecttype) %(refname:short)' | awk '$1 == "commit" {print $2}' ;
}
因此
git for-each-ref refs/tags | grep -v commit
不仅会列出带注释的标签,还会列出斑点和树的标签。我建议对“标签”一词使用 grep 来查找带注释的标签:
git for-each-ref refs/tags | grep -w tag
.不要忘记
-w
,否则你会发现子字符串
tag
也适用于轻量级标签。
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}'
第一个字段是哈希值,第二个字段是类型,第三个字段是引用的名称