我如何判断给定的 git 标签是带注释的还是轻量级的?
How can I tell if a given git tag is annotated or lightweight?
我输入 git tag
,它列出了我当前的标签:
1.2.3
1.2.4
如何确定其中哪些是注释的,哪些是轻量级的?
请尝试使用 git describe
https://git-scm.com/docs/git-describe
By default (without --all or --tags) git describe only shows annotated tags.
获取标签名称(比如 foo
),然后执行 git cat-file -t foo
。如果它是一个带注释的标签,cat-file
会告诉你它是一个 "tag"。如果它是一个简单的标签,cat-file
会告诉你它是一个 "commit"。
更新:正如矛盾修饰符在他的评论中所说,git show
也有效,但它为您提供的信息不仅仅是它是什么类型的标签。
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 是 "lightweight" 并且注释了“1.2.4”)。
git for-each-ref
告诉你默认情况下每个 ref 是什么,它的 id 和它的类型。要将其限制为标签,请执行 git for-each-ref refs/tags
.
[T]he output has three fields: The hash of an object, the type of the object, and the name in refs/tags that refers to the object. A so-called "lightweight" tag is a name in refs/tags that refers to a commit
¹ object. An "annotated" tag is a name in refs/tags that refers to a tag
object.
- Solomon Slow (in the comments)
这是一个例子:
$ 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 这样的核心命令会做
我输入 git tag
,它列出了我当前的标签:
1.2.3
1.2.4
如何确定其中哪些是注释的,哪些是轻量级的?
请尝试使用 git describe
https://git-scm.com/docs/git-describe
By default (without --all or --tags) git describe only shows annotated tags.
获取标签名称(比如 foo
),然后执行 git cat-file -t foo
。如果它是一个带注释的标签,cat-file
会告诉你它是一个 "tag"。如果它是一个简单的标签,cat-file
会告诉你它是一个 "commit"。
更新:正如矛盾修饰符在他的评论中所说,git show
也有效,但它为您提供的信息不仅仅是它是什么类型的标签。
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 是 "lightweight" 并且注释了“1.2.4”)。
git for-each-ref
告诉你默认情况下每个 ref 是什么,它的 id 和它的类型。要将其限制为标签,请执行 git for-each-ref refs/tags
.
[T]he output has three fields: The hash of an object, the type of the object, and the name in refs/tags that refers to the object. A so-called "lightweight" tag is a name in refs/tags that refers to a
commit
¹ object. An "annotated" tag is a name in refs/tags that refers to atag
object.- Solomon Slow (in the comments)
这是一个例子:
$ 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 这样的核心命令会做