列出git-ls-remote时为什么标签名称后面有"^ {}"?

And*_*ris 68 git

当我git ls-remote在工作树中运行时,该命令输出原始仓库中的修订列表.出于某种原因,我对每个标签都进行了2次修订,对于同一标签的第二次修订,标签名称包括^{}

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^{}
Run Code Online (Sandbox Code Playgroud)

我用它创建标签

git tag -a v0.1.8 -m "tag message"
git push --tags
Run Code Online (Sandbox Code Playgroud)

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

Tux*_*ude 117

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

当您用于git tag -a创建标记时,git会为您创建一个带注释的标记.

^{}是用于取消引用标记的语法.它在gitrevisions中有描述.

  • 当与标记对象一起使用时,git将递归地取消引用标记,直到它找到非标记对象.

  • 当与非标签对象一起使用时,它不会做任何事情,相当于跳过 ^{}

refs/tags/v0.1.6存储库中的ref指向标记对象bb944682f7f65272137de74ed18605e49257356c,而标记对象又指向771a930dc0ba86769d6862bc4dc100acc50170fa(非标记对象),我猜测它是在创建标记时存储提交信息.

所以当你这样做时refs/tags/v0.1.6^{},git会取消引用标记并将其解析为771a930dc0ba86769d6862bc4dc100acc50170fa- 非标记对象.

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

$ 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^{}
Run Code Online (Sandbox Code Playgroud)

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

这是我的一个测试git存储库中的信息.

$ 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.
Run Code Online (Sandbox Code Playgroud)

  • 这种解释比重复问题中的解释更好! (7认同)