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

标签 git tags git-bash

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

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

最佳答案

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

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

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

好消息是,没有绝对要求您使用“正确”的注释标记和轻量级标记。也就是说,一个带注释的标签实际上是一对实体:一个轻量级标签(具有一些名称,只是 refs/tags/ namespace 中的一个条目),以及一个带注释的标签对象(在存储库本身)通常在其 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 - 如何在 Git 中重命名带注释的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34012095/

相关文章:

windows-7 - Git ssh.exe 已停止工作

git - .PO (gettext) 文件的 3 向 Git merge 驱动程序在哪里?

git - 由于正在创建 @tmp 路径,Jenkins 管道作业找不到脚本

git - 检测 '-s ours' 进行的 merge

asp.net-mvc - asp.net mvc 标签 : <%: %> vs. <%= %>

javascript - 如何创建谷歌标签管理器触发器

python - Selenium Python 如何从 <div> 获取文本(html 源)

linux - 无法克隆 github 存储库

git - 如何创建自定义 git/bash 脚本?

找不到 git fatal error refs