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

当我在工作树中运行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^{} 

我使用创build标签

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

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

有两种types的标签 – lightweightannotated 。 轻量级标签只是指向一些对象的引用,而带注释的标签本身就是一个独立的git对象,并存储了更多的信息,如作者,提交者,提交信息等。

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

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

  • 当与标签对象一起使用时,git会recursion地解引用标签,直到find一个非标签对象。

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

库中的refs/tags/v0.1.6 ref指向标记对象bb944682f7f65272137de74ed18605e49257356c ,后者依次指向771a930dc0ba86769d6862bc4dc100acc50170fa (一个非标记对象),我猜测它是在创build标记时存储提交信息的。

所以当你做refs/tags/v0.1.6^{} ,git会解引用标签并将其parsing为771a930dc0ba86769d6862bc4dc100acc50170fa – 非标签对象。

还有一个git show-ref命令可以用来只列出标签,并可以select如下解除引用,在你的情况下应该产生以下输出:

 $ 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对象的细节。

这是来自我的一个testinggit仓库的信息。

 $ 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.