当列出git-ls-remote时,为什么会有“^ {}”标签名称之后? [英] When listing git-ls-remote why there's "^{}" after the tag name?

查看:254
本文介绍了当列出git-ls-remote时,为什么会有“^ {}”标签名称之后?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  git ls-remote 
来自git@github.com:andris9 / zzzzzz.git
d69e66d7c915b9682618b7f304b80cc0ae4c7809 HEAD
....
bb944682f7f65272137de74ed18605e49257356c裁判/标签/ v0.1.6
771a930dc0ba86769d6862bc4dc100acc50170fa裁判/标签/ v0.1.6 ^ {}
a72251d945353a360087eb78ee75287c38a1c0e6裁判/标签/ v0.1.7
d69e66d7c915b9682618b7f304b80cc0ae4c7809裁判/标签/ v0.1.7 ^ {}

我用

创建标签

  git tag -a v0.1.8 -m标记信息
git push --tags

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

解决方案

<有两种类型的标签 - 轻量级注释。轻量级标签仅仅是指向一些对象的引用,而带注释的标签本身就是一个单独的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 命令可以用于仅列出标签,并可选择如下解除引用,并在您的情况下应该产生以下输出: ref --tags
    bb944682f7f65272137de74ed18605e49257356c refs / tags / v0.1.6
    a72251d945353a360087eb78ee75287c38a1c0e6 refs / tags / v0.1.7

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

    要确认这一点,您可以使用 git show 命令给你更多关于git对象的细节。 / p>

    这是我的一个tes的信息t git repositories。

      $ git show 43f9a98886ba873c0468c608f24c408b9991414f 
    tag v0.1
    Tagger:Ash< tuxdude @柯博文>
    日期:Sun Jul 15 00:14:43 2012-0700

    标记稳定的回购0.1 :)
    ----- BEGIN PGP SIGNATURE -----
    < PGP-SIGNATURE>
    ----- END PGP SIGNATURE -----

    commit e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08
    合并:796efcd 58e3a4d
    作者:Ash< tuxdude @ OptimusPrime>
    日期:Sun Jul 15 00:02:44 2012 -0700

    将分支'dev'合并到'主'中以获得稳定的0.1。

    $ git show e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08
    commit e55df25f2321a6b2c9a02fa80ccba7cbe3c38c08
    合并:796efcd 58e3a4d
    作者:Ash< tuxdude @ OptimusPrime>
    日期:Sun Jul 15 00:02:44 2012 -0700

    将分支'dev'合并到'主'中以获得稳定的0.1。


    When I run git ls-remote in the work tree, the command outputs a list of revisions in the origin repo. For some reason I get 2 revisions with every tag and for the second revision of the same tag, the tag name includes ^{}

    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^{}
    

    I create tags with

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

    From the examples of git-ls-remote man page there are no such duplicate tags, so maybe I'm doing something wrong?

    解决方案

    There are 2 types of tags - lightweight and annotated. Lightweight tags are merely refs that point to some object whereas annotated tags are a separate git object by themselves, and store a lot more information like author, committer, a commit message, etc.

    When you used git tag -a to create a tag, git would have created an annotated tag for you.

    The ^{} is the syntax used to dereference a tag. It is described in gitrevisions.

    • When used with tag objects, git would recursively dereference the tag until it finds a non-tag object.

    • When used with non-tag objects, it doesn't do anything and is equivalent to skipping the ^{}

    The refs/tags/v0.1.6 ref in your repository points to the tag object bb944682f7f65272137de74ed18605e49257356c, which in turn points to 771a930dc0ba86769d6862bc4dc100acc50170fa (a non-tag object) which I'm guesssing is storing the commit information when you created the tag.

    So when you do refs/tags/v0.1.6^{}, git is going to dereference the tag and resolve it to 771a930dc0ba86769d6862bc4dc100acc50170fa - the non-tag object.

    There is also a git show-ref command that can be used to list only tags, and optionally dereference as follows, and in your case should produce the following output:

    $ 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^{}
    

    To confirm this, you can use git show command to give you more details about the git object.

    This is the information from one of my test git repositories.

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

    这篇关于当列出git-ls-remote时,为什么会有“^ {}”标签名称之后?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆