如何在Git中重命名带注释的标签

时间:2015-12-01 03:30:45

标签: git tags git-bash

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

我在存储库中有几乎一百个表示版本号的标签,每个标签都注明了有关该版本更改内容的有用说明。我想更改我用于这些标签的命名方式,记录标签消息,删除标签,并使用旧消息和新名称重新创建它将是手动执行的噩梦差不多有一百个标签。执行此操作的脚本或一系列git命令对自动化非常有用。

2 个答案:

答案 0 :(得分:7)

坏消息是带注释的标记对象的名称嵌入在带注释的标记对象中。因此,如果您想要完全彻底,那么您需要替换这些标记对象:

  • 如果他们已经签名标记,您需要使用新签名重新生成它们。

  • 否则,可以将标记对象复制到新标记对象,并且系统名称会发生​​变化。例如,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

(我恢复了旧标签并在此之后删除了#34;傻&#34;版本,所以它没有经过彻底的测试,但它至少没有爆炸。)

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

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

答案 1 :(得分:4)

如果您想将单个带注释的代码v1.0.0重命名为1.0.0

,请汇总torek's answer

变体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