【发布时间】:2016-03-04 21:14:52
【问题描述】:
如何在 Git 中重命名现有的注释标签?
我有近百个标签表示存储库上的版本号,每个标签都带有关于该版本更改内容的有用描述。我想更改我用于这些标签的命名风格,记录标签消息,删除标签,并用旧消息和新名称重新创建它,对于近百个标签手动执行将是一场噩梦.执行此操作的脚本或一系列 git 命令对自动化很有用。
【问题讨论】:
如何在 Git 中重命名现有的注释标签?
我有近百个标签表示存储库上的版本号,每个标签都带有关于该版本更改内容的有用描述。我想更改我用于这些标签的命名风格,记录标签消息,删除标签,并用旧消息和新名称重新创建它,对于近百个标签手动执行将是一场噩梦.执行此操作的脚本或一系列 git 命令对自动化很有用。
【问题讨论】:
总结torek's answer 用于将单个带注释标签v1.0.0 重命名为1.0.0 的情况
警告:
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
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
【讨论】:
s/^tag v1\.0\.0$/tag 1.0.0/匹配
坏消息是带注释的标记对象的名称嵌入在该带注释的标记对象中。所以如果你想彻底彻底,你需要替换那些标签对象:
如果它们是签名的标签,您需要用新的签名重新生成它们。
否则,可以将标记对象复制到新标记对象,并进行系统名称更改。例如,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 的方式 =)