【问题标题】:How can I tell if a given git tag is annotated or lightweight?如何判断给定的 git 标签是带注释的还是轻量级的?
【发布时间】:2017-03-21 15:42:19
【问题描述】:

我输入git tag,它会列出我当前的标签:

1.2.3
1.2.4

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

【问题讨论】:

  • git tag -n 对你有什么帮助吗?
  • 标签注释不是提交消息。你用 git-log(1) 看不到它;你需要使用 git-show(1)
  • git tag -n 很有趣!但这对于我的具体问题来说并不是万无一失的。
  • 我喜欢“git show-ref -d --tags”。

标签: git git-tag


【解决方案1】:

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

[T]他的输出具有三个字段:对象的哈希、对象的类型和引用对象的 refs/tags 中的名称。所谓的“轻量级”标签是 refs/tags 中引用 commit¹ 对象的名称。 “带注释的”标签是 refs/tags 中引用 tag 对象的名称。

-Solomon Slow(在 cmets 中)

这是一个例子:

$ 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

要仅对一个 ref 执行此操作,您可以在本地 ref 上使用 git cat-file -t 以继续该示例:

$ git cat-file -t v1.0-light
commit
$ git cat-file -t v1.1-annot
tag

¹ 标签可以引用任何 Git 对象,如果您希望好友只获取一个文件并且您的 repo 有一个 git 服务器,您可以 git tag forsam :that.file 并且 Sam 可以获取它并显示它。大多数便利命令不知道如何处理标记的 blob 或树,但 update-index 等核心命令可以

【讨论】:

  • 当我尝试这个时,the output 将每个标签列为committag。我想那些分别表示轻量级和带注释的标签?
  • @StevenVascellaro 没错,轻量级标签只是以“refs/tags”开头的本地引用,它可以是任何东西。对象数据库中的标签不仅仅是一个名称,而且可以像任何其他对象一样被运送。 Git 为对象数据库中的每个标签创建本地引用,因此区别有些模糊,一旦为他们的项目设置了工作流程,通常没有人需要太在意。
  • 所以commit 是轻量级的,tag 是注解的?
  • @Pontiacks,输出包含三个字段:对象的哈希、对象的类型以及引用对象的 refs/tags 中的名称。所谓的“轻量级”标签是 refs/tags 中引用 commit 对象的名称。 “带注释的”标签是 refs/tags 中引用 tag 对象的名称。
【解决方案2】:

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”被注释)。

【讨论】:

    【解决方案3】:

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

    更新:正如矛盾修饰符在他的评论中所说,git show 也有效,但它为您提供的信息不仅仅是它是什么类型的标签。

    【讨论】:

    • 对于“给定标签”(如问题中所述),这似乎是到目前为止最好的答案。
    • 优秀的答案 - 其工作原理的关键是“git cat-file”上的“-t”选项。正如手册页解释的那样:“-t 显示由 标识的对象类型,而不是内容。”
    • 或者使用git cat-file -p foo查看区别和消息+元
    【解决方案4】:

    请尝试使用git describe

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

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

    【讨论】:

    • 这不会显示所有带注释的标签。它只显示那些在同一分支上的人。如果您正在关注基于主干的开发并在代码冻结中从主干分支并在分支将要发布时对其进行标记,则该标记不会与主干位于同一分支,并且 git describe 不会显示它。
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多