如何判断给定的git标签是带注释的还是轻量的?


77

我输入git tag并列出了我当前的标签:

1.2.3
1.2.4

如何确定其中哪些是带注释的,哪些是轻量的?


3
git tag -n为你做些什么?
Oxymoron

标签注释不是提交消息。您无法使用git-log(1)看到它;您需要使用git-show(1)
Oxymoron

git tag -n很有趣!但这对我的特定问题不是防弹。
G.西尔维·戴维斯

1
我喜欢“ git show-ref -d --tags”。
G.西尔维·戴维斯

Answers:


54

git for-each-ref告诉您默认情况下每个引用的含义,编号和类型。要将其限制为仅标记,请执行git for-each-ref refs/tags

输出具有三个字段:对象的哈希,对象的类型以及引用对象的引用/标记中的名称。所谓的“轻量级”标记是引用/标记中引用commit对象的名称。“带注释的”标记是引用/标记中引用tag对象的名称。

-所罗门慢(在评论)

这是一个例子:

git for-each-ref refs/tags                                           
902fa933e4a9d018574cbb7b5783a130338b47b8 commit refs/tags/v1.0-light
1f486472ccac3250c19235d843d196a3a7fbd78b tag    refs/tags/v1.1-annot
fd3cf147ac6b0bb9da13ae2fb2b73122b919a036 commit refs/tags/v1.2-light

7
当我尝试此操作时,输出将每个标签列出为acommit或a tag。我认为那些分别指示轻量级标签和带注释的标签?
Stevoisiak

4
@StevenVascellaro是的,一个轻量级标签只是本地引用以“ refs / tags”开头,可以是任何东西。对象db中的标签不仅具有名称,而且可以像其他任何对象一样被运送。Git为对象db中的每个标签制作本地引用,因此区别有些模糊,通常,一旦为他们的项目设置了工作流,就不必再在意了。
jthill

3
那么commit轻便又带tag注释?
Pontiacks

6
@Pontiacks,输出具有三个字段:对象的哈希,对象的类型以及引用对象的引用/标记中的名称。所谓的“轻量级”标记是引用/标记中引用commit对象的名称。“带注释的”标记是引用/标记中引用tag对象的名称。
所罗门慢

44

git show-ref -d --tags命令排序这样做,因为轻量级标签输出发生一次,两次出现注释标记。另外,只有带注释的标记在输出中包括“ ^ {}”解引用运算符。

588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.3
7fe2caaed1b02bb6dae0305c5c0f2592e7080a7a refs/tags/1.2.4
588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.4^{}

然后可以使用unix sort,sed,cut和uniq命令对该输出进行按摩,以使输出更具可读性:

git show-ref -d --tags       | 
cut -b 42-                   | # to remove the commit-id
sort                         |
sed 's/\^{}//'               | # remove ^{} markings
uniq -c                      | # count identical lines
sed 's/2\ refs\/tags\// a /' | # 2 identicals = annotated
sed 's/1\ refs\/tags\//lw /'   

对于我的原始存储库(根据我的问题),它输出以下内容:

  lw 1.2.3
   a 1.2.4

(例如,1.2.3是“轻量级”,而“ 1.2.4”是带注释的)。


26

获取标签名称(例如foo),然后执行git cat-file -t foo。如果是带注释的标签,cat-file将告诉您这是“标签”。如果是简单标记,cat-file则会告诉您这是“提交”。

更新:正如oxymoron在他的评论中说的那样,git show它也可以工作,但它不仅为您提供哪种标签,还为您提供了更多信息。


2
对于“特定标签”(在这个问题的陈述),这似乎是迄今为止最好的答案。
phils

1
出色的答案-运作方式的关键是“ git cat-file”上的“ -t”选项。如手册页所述:“ -t代替内容,显示由<object>标识的对象类型。”
G.西尔维·戴维斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.