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

Par*_*yes 8 tags git git-bash

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

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

tor*_*rek 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
Run Code Online (Sandbox Code Playgroud)

(之后我恢复了旧标签并删除了"傻"版本,所以它没有经过彻底的测试,但它至少没有爆炸.)

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

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


das*_*s-g 5

当您想将单个带注释的标签重命名为just 时,总结torek的答案v1.0.01.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
Run Code Online (Sandbox Code Playgroud)

变体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
Run Code Online (Sandbox Code Playgroud)