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

G. *_*ies 56 git

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

1.2.3
1.2.4
Run Code Online (Sandbox Code Playgroud)

如何确定哪些是注释的,哪些是轻量级的?

jth*_*ill 42

git for-each-ref告诉你默认情况下每个ref是什么,它的id和类型.要将其限制为仅标记,请执行git for-each-ref refs/tags.

  • 当我尝试这个时,[输出](http://imgur.com/b00mvjr)将每个标签列为`commit`或`tag`.我认为那些分别表示轻量级和注释标签? (6认同)
  • @Pontiacks,输出有三个字段:对象的哈希值,对象的类型,以及引用该对象的引用/标记中的名称.所谓的"轻量级"标记是refs/tags中的一个名称,它引用了`commit`对象."带注释的"标记是refs/tags中引用"tag"对象的名称. (5认同)
  • 那么`commit`是轻量级的,而`tag`是带注释的? (3认同)
  • @StevenVascellaro没错,轻量级标签只是本地引用以“ refs / tags”开头,可以是任何东西。对象db中的标签不仅具有名称,而且可以像其他任何对象一样被运送。Git为对象db中的每个标签制作本地引用,因此区分有些模糊,通常,一旦为他们的项目设置了工作流,就不必再在意了。 (2认同)

G. *_*ies 35

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

588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.3
7fe2caaed1b02bb6dae0305c5c0f2592e7080a7a refs/tags/1.2.4
588e9261795ec6dda4bd0a881cf1a86848e3d975 refs/tags/1.2.4^{}
Run Code Online (Sandbox Code Playgroud)

并且可以使用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 /'   
Run Code Online (Sandbox Code Playgroud)

对于我原来的回购(来自我的问题),它输出:

  lw 1.2.3
   a 1.2.4
Run Code Online (Sandbox Code Playgroud)

(例如,1.2.3是"轻量级","1.2.4"是注释的).


Nou*_*him 18

获取标签名称(比如说foo),然后执行git cat-file -t foo.如果它是一个带注释的标签,cat-file会告诉你它是一个"标签".如果它是一个简单的标签,cat-file会告诉你它是一个"提交".

更新:正如oxymoron在他的评论中所说,git show它也有效,但它提供的信息不仅仅是它是什么样的标签.

  • 对于“给定标签”(如问题中所述),这似乎是迄今为止的最佳答案。 (2认同)
  • 很好的答案 - 其工作原理的关键是“git cat-file”上的“-t”选项。正如手册页所解释的:“-t 显示 <object> 标识的对象类型,而不是内容。” (2认同)

Oxy*_*ron 12

请尝试使用 git describe

https://git-scm.com/docs/git-describe

默认情况下(不带--all或--tags)git describe只显示带注释的标签.

  • 这不会显示所有带注释的标签。它确实只显示位于同一分支上的那些人。如果您遵循基于主干的开发,并在代码冻结中从主干分支,并在要发布分支时标记该分支,则该标记不会与主干位于同一分支上,并且 git 描述不会显示它。 (2认同)