列出git-ls-remote时,为什么标记名称后面有“ ^ {}”?

 2019-09-30 

When listing git-ls-remote why there's “^{}” after the tag name?

本问题已经有最佳答案,请猛点这里访问。

当我在工作树中运行git ls-remote时,该命令在原始存储库中输出修订列表。 出于某种原因,我每个标签都有2个修订版本,而同一标签的第二个修订版本,标签名称包含^{}

1
2
3
4
5
6
7
8
git ls-remote
From git@github.com:andris9/zzzzzz.git
d69e66d7c915b9682618b7f304b80cc0ae4c7809    HEAD
....
bb944682f7f65272137de74ed18605e49257356c    refs/tags/v0.1.6
771a930dc0ba86769d6862bc4dc100acc50170fa    refs/tags/v0.1.6^{}
a72251d945353a360087eb78ee75287c38a1c0e6    refs/tags/v0.1.7
d69e66d7c915b9682618b7f304b80cc0ae4c7809    refs/tags/v0.1.7^{}

我用创建标签

1
2
git tag -a v0.1.8 -m"tag message"
git push --tags

git-ls-remote手册页的示例中,没有这样的重复标签,所以也许我做错了什么?


标签有2种类型-lightweightannotated。轻量级标签仅仅是指向某个对象的引用,而带注释的标签本身就是一个单独的git对象,并存储更多的信息,例如作者,提交者,提交消息等。

当您使用git tag -a创建标签时,git会为您创建一个带注释的标签。

^{}是用于取消引用标签的语法。它在gitrevisions中描述。

  • 当与标签对象一起使用时,git会递归地取消引用标签,直到找到非标签对象为止。

  • 与非标记对象一起使用时,它不执行任何操作,等效于跳过^{}

存储库中的refs/tags/v0.1.6引用指向标记对象bb944682f7f65272137de74ed18605e49257356c,它依次指向771a930dc0ba86769d6862bc4dc100acc50170fa(非标记对象),我猜想它是在创建标记时存储提交信息的。

因此,当您执行refs/tags/v0.1.6^{}时,git将取消引用标记并将其解析为771a930dc0ba86769d6862bc4dc100acc50170fa-非标记对象。

还有一个git show-ref命令可用于仅列出标签,并可以选择如下取消引用,并且在您的情况下应产生以下输出:

1
2
3
4
5
6
7
8
9
$ git show-ref --tags
bb944682f7f65272137de74ed18605e49257356c    refs/tags/v0.1.6
a72251d945353a360087eb78ee75287c38a1c0e6    refs/tags/v0.1.7

$ git show-ref --tags --dereference
bb944682f7f65272137de74ed18605e49257356c    refs/tags/v0.1.6
771a930dc0ba86769d6862bc4dc100acc50170fa    refs/tags/v0.1.6^{}
a72251d945353a360087eb78ee75287c38a1c0e6    refs/tags/v0.1.7
d69e66d7c915b9682618b7f304b80cc0ae4c7809    refs/tags/v0.1.7^{}

要确认这一点,可以使用git show命令为您提供有关git对象的更多详细信息。

这是来自我的测试git存储库之一的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ git show 43f9a98886ba873c0468c608f24c408b9991414f
tag v0.1
Tagger: Ash <tuxdude@OptimusPrime>
Date:   Sun Jul 15 00:14:43 2012 -0700

Tagging Stable repo 0.1 :)
-----BEGIN PGP SIGNATURE-----
<PGP-SIGNATURE>
-----END PGP SIGNATURE-----

commit e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08
Merge: 796efcd 58e3a4d
Author: Ash <tuxdude@OptimusPrime>
Date:   Sun Jul 15 00:02:44 2012 -0700

    Merge branch 'dev' into 'master' for stable 0.1.

$ git show e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08
commit e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08
Merge: 796efcd 58e3a4d
Author: Ash <tuxdude@OptimusPrime>
Date:   Sun Jul 15 00:02:44 2012 -0700

    Merge branch 'dev' into 'master' for stable 0.1.