【问题标题】:How to rename an annotated tag in Git如何在 Git 中重命名带注释的标签
【发布时间】:2016-03-04 21:14:52
【问题描述】:

如何在 Git 中重命名现有的注释标签?

我有近百个标签表示存储库上的版本号,每个标签都带有关于该版本更改内容的有用描述。我想更改我用于这些标签的命名风格,记录标签消息,删除标签,并用旧消息和新名称重新创建它,对于近百个标签手动执行将是一场噩梦.执行此操作的脚本或一系列 git 命令对自动化很有用。

【问题讨论】:

    标签: git tags git-bash


    【解决方案1】:

    总结torek's answer 用于将单个带注释标签v1.0.0 重命名为1.0.0 的情况

    变体1:重命名替换轻量级标签底层标签对象

    警告:

    • 会破坏已签名标签的签名。仅用于未签名的注释标签。
    • 像下面这样简单的sed 替换也将更改标签消息和标签的标签名称中v1.0.0 的出现(如果有)。如果这不是您想要的,请使用更具体的 RegEx。
    git tag "1.0.0" $(git cat-file -p "v1.0.0" | sed 's/v1\.0\.0/1.0.0/g' | git mktag)
    # You might want to check the result before continuing to delete the old tag.
    
    # Delete the old tag locally
    git tag -d v1.0.0
    
    # Delete the old tag on the default remote (origin)
    git push origin :v1.0.0
    

    变体2:重命名 只替换轻量级标签,让它指向原来的底层标签对象

    git tag "1.0.0" "v1.0.0"
    
    # Delete the old tag locally
    git tag -d v1.0.0
    
    # Delete the old tag on the default remote (origin)
    git push origin :v1.0.0
    

    【讨论】:

    • 或者您不能将“g”标签附加到您的 sed 命令;因此只有第一个匹配项(将是标签名称)会被更改。
    • 或者只是将行的确切格式与s/^tag v1\.0\.0$/tag 1.0.0/匹配
    【解决方案2】:

    坏消息是带注释的标记对象的名称嵌入在该带注释的标记对象中。所以如果你想彻底彻底,你需要替换那些标签对象:

    • 如果它们是签名的标签,您需要用新的签名重新生成它们。

    • 否则,可以将标记对象复制到新标记对象,并进行系统名称更改。例如,filter-branch 命令就是这样做的。 (这有点难看,因为您必须使用一些低级管道命令;没有简单方便的方法。但请参见下文。)

    好消息是,没有绝对要求您使用“正确”注释标签和轻量级标签。也就是说,一个带注释的标签实际上是一对实体:一个轻量级标签(其名称只是 refs/tags/ 命名空间中的一个条目),以及一个带注释的标签对象(在存储库本身中),通常具有tag 字段中的名称相同。但是你可以创建一个新的轻量级标签,指向现有的注解标签对象,然后选择性地删除原来的轻量级标签:

    $ git cat-file -p v2.5.0 | sed 's/@/ /'
    object a17c56c056d5fea0843b429132904c429a900229
    type commit
    tag v2.5.0
    tagger Junio C Hamano <gitster pobox.com> 1438025401 -0700
    
    Git 2.5
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1
    
    iQIcBAABAgAGBQJVtoa5AAoJELC16IaWr+bLRtQP/0RYjVe9fLubiN5vLaAJ98B5
    K3apw8bScJ4bZQJiOGMZg7AJ8pSB9XchqopjNlO2v8XVrZEkFPQ7ln3ELjOITusO
    0MIZz6Y4sS0yqMklNPWx/OIzvSyKOs8quUA/J87Ha+pnMYlobDgWJxDnZ3hVO6q2
    0lVMRUvwM9qsBiPsVKyAba5qPDBn9uTjgR/hivA3Ha97foq/qMM6rjERp5hX8KTE
    JacLMlx7ZSAJiNKmz1mVk+xyDVGDh9nojiz93jRYohAM8gsbyyRayPGKlKsMrajC
    s0bLxilV8zupNrMOs54ND71VqNo992ewiCrB3FBpTah2rPE0MKsxCY72pFiZp/hn
    w1I3seQbd880d2TXfczVVphG3xN3xbfnC+aEqobgPuFIgGxHqeWqUpDQnWa0XhtK
    i5phhENEjbMdCDGf7ylRRvCTL5O2Mz1XnNfZBP0uqIX6PyzaCwcZM1DUP0xY8Nvz
    xo0BplMvK4sAr+fCW0HHHlDO6Ky3jjRyPUEyVEbwF50lZ3Sgzkkf32I06yeZgQW9
    Ge6+qGopw7JVQM95UDMBysbQSNuTmwnclwn0DBfc85vQwZw5OwnRk0RsQxcnqNr2
    B4Nyubl8Pge4H0T0pahpAdr0AU7JHv4i4yYZh1Dr4d+hzzXAK+ospCxkcJVX7Qz5
    BP8pbLPj3ubLAenxg71I
    =xfTv
    -----END PGP SIGNATURE-----
    $ git rev-parse v2.5.0
    8d1720157c660d9e0f96d2c5178db3bc8c950436
    $ git tag silly v2.5.0
    $ git rev-parse silly
    8d1720157c660d9e0f96d2c5178db3bc8c950436
    $ git tag -d v2.5.0
    Deleted tag 'v2.5.0' (was 8d17201)
    $ git for-each-ref refs/tags/silly
    8d1720157c660d9e0f96d2c5178db3bc8c950436 tag    refs/tags/silly
    

    (我恢复了旧标签并在此之后删除了“傻”版本,所以它没有经过非常彻底的测试,但至少没有炸毁。)

    要自动复制标签或重新创建标签(带或不带签名),只需使用git for-each-ref 查找所有旧标签,然后使用生成的名称创建新标签。使用git cat-file -p 漂亮地打印现有标签以进行修改以制作新标签,或者只是使新标签指向现有标签对象。打印标签(到管道或文件)后,您可以使用 sed 或其他一些可编程编辑器对其进行编辑,并将结果作为输入文件提供给 git tag -F,或提供给 git mktag 以创建标签对象,提供结果SHA-1 到git tag 制作对应的轻量级标签。

    (注意:如果您已经编写了一个 bash 脚本来完成所有这些工作,并且只需要帮助来完成它或纠正一些问题,请发布到目前为止的脚本。)

    【讨论】:

    • 我没试过,但你的方法看起来比设置脚本更快。如果我认为它可能对某人有用,我将发布我制作的脚本,它只是从git tag -n99 中提取有用信息,否则感谢 git 的方式 =)
    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2013-08-11
    • 2021-12-14
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多