【问题标题】:Can a lightweight tag be converted to an annotated tag?可以将轻量级标签转换为带注释的标签吗?
【发布时间】:2011-06-27 12:23:58
【问题描述】:

我用轻量级标签标记了一个提交,并将该标签推送到一个远程仓库,与其他开发人员共享。我现在意识到我应该对它进行注释,以便它出现在 git describe 中。

有没有办法在不破坏任何东西的情况下转换它/重新标记提交?

【问题讨论】:

    标签: git tags git-tag


    【解决方案1】:

    轻量级标签只是指向该提交的“参考”。您可以在旧标签之上强制创建一个新的注释标签:

    git tag -a -f <tagname> <tagname>
    

    从 Git v1.8.2 开始,您需要使用 --force 将远程上的任何标签替换为 git push,即使您将轻量级标签替换为有效的快进标签或真正的标签指向与现有标记引用相同的提交的对象。

    git push --force origin <tagname>
    

    【讨论】:

    • 但这不会使用令人困惑的日期吗?
    • 另外,对于已经拉取原始轻量级标签的开发人员有什么影响吗?那些开发者在再次拉取后会看到新标签的注释,还是他们需要做一些特别的事情(比如删除他们的本地标签)?
    • @ZacThompson:这在 v1.8.2(2013 年 3 月)中发生了变化
    • 如果您不想使用标签来标记标签,请改为使用git tag -a -f &lt;tagname&gt; &lt;tagname&gt;^0。否则,您将创建对旧标签的新引用,而不是被盗的 refs/tags/&lt;tagname&gt;,将其从垃圾收集中排除。
    • 警告:如果您在 GitHub 存储库上执行此操作,并且您要替换的轻量级标签与发布相关联,则删除它会静默删除整个发布(和发布注释)与轻量级标签相关联。如here 所述,无法恢复意外删除的版本。
    【解决方案2】:

    基于Charles' answerthis blog post,我认为最好使用这样的东西:

    #!/bin/sh
    tag=$1
    date="$(git show $tag --format=%aD | head -1)"
    GIT_COMMITTER_DATE="$date" git tag -a -f $tag $tag
    

    【讨论】:

    • 不错 :) 您可以使用 -s--no-patch 代替 | head -1。也许使用 committer 日期 (%cD)(以及他们的名字,%cn,如GIT_COMMITER_NAME)可能是可取的。
    • 还有电子邮件! GIT_COMMITTER_EMAIL%ce (attn.committer 总是用双拼TT)
    • @TobiasKienzler 嗯,我不认为我会使用他们的名字,除非我有理由相信他们实际上已经标记了它。但是,使用提交者日期而不是作者日期确实有意义,因为标签不能在提交之前制作,并且提交者日期通常不在作者日期之前...
    • @SamB 啊,没错,我当然假设提交者已标记,您提到的 now (抱歉:) 可能无法仅从轻量级标签中确定,好点
    【解决方案3】:

    将所有标签转换为带注释的(基于 Charles Bailey 的示例和 Ferenc Wágner 的评论):

    for tag in $(git tag -l); do git tag -a -f $tag $tag^0 -m $tag; done
    git push --tags --force
    

    【讨论】:

      【解决方案4】:

      您也可以简单地使用git describe --tags 在搜索中也包含轻量级标签。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 2014-04-02
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        相关资源
        最近更新 更多