如何重命名Git标记?

如何重命名Git标记?,git,git-tag,Git,Git Tag,今天我翻阅了一个项目的日志,意识到我在前一段时间胖指了一个标签名。有没有办法重命名标签?谷歌没有发现任何有用的东西 我意识到我可以检查标签版本并制作一个新标签,我甚至试过了。但这似乎创建了一个不太正确的标记对象。首先 git tag -l 相对于所有其他标记,将其按顺序列出。我不知道这是否重要,但这让我相信新的标记对象并不是我想要的。我可以接受这一点,因为我真的只关心标记名是否与文档匹配,但我宁愿做得“正确”,前提是有一种正确的方法来做到这一点。如果它被发布,你不能删除它(也就是说,不冒被涂上

今天我翻阅了一个项目的日志,意识到我在前一段时间胖指了一个标签名。有没有办法重命名标签?谷歌没有发现任何有用的东西

我意识到我可以检查标签版本并制作一个新标签,我甚至试过了。但这似乎创建了一个不太正确的标记对象。首先

git tag -l

相对于所有其他标记,将其按顺序列出。我不知道这是否重要,但这让我相信新的标记对象并不是我想要的。我可以接受这一点,因为我真的只关心标记名是否与文档匹配,但我宁愿做得“正确”,前提是有一种正确的方法来做到这一点。

如果它被发布,你不能删除它(也就是说,不冒被涂上焦油和羽毛的风险)。“Git方式”是:

理智的事情。承认你搞砸了,换个名字。其他人已经看到了一个标记名,如果您保持相同的名称,您可能会遇到两个人都有“版本X”,但他们实际上有不同的“X”。所以就叫它“X.1”就行了

或者

疯狂的事情。你真的想把新版本也叫做“X”,尽管其他人已经看到了旧版本。所以只需再次使用git tag-f,就好像您还没有发布旧的一样

这太疯狂了,因为:

Git不会(也不应该)改变用户背后的标签。因此,如果有人已经得到了旧标签,那么在你的树上进行git拉操作不应该仅仅让他们覆盖旧标签

如果有人从你那里得到了一个发布标签,你不能仅仅通过更新你自己的标签来更改他们的标签。这是一个很大的安全问题,因为人们必须能够信任他们的标签名。如果你真的想做这件疯狂的事,你需要做的就是勇敢面对,告诉人们你把事情搞砸了


最初的问题是如何重命名标记,这很简单:首先创建NEW作为OLD的别名:
git tag NEW-OLD
,然后删除OLD:
git tag-d OLD


关于“Git方式”和(in)sanity的引述是不正确的,因为它所说的是保留标记名,但使其引用不同的存储库状态。

以下是我如何将标记从
旧的
重命名为
新的

git tag new old
git tag -d old
git push origin new :old
push命令中的冒号从远程存储库中删除标记。如果 如果不这样做,Git将在您的机器上创建旧标记。 最后,确保其他用户删除已删除的标记。请告诉我 让他们(同事)运行以下命令:

git pull --prune --tags
请注意,如果要更改带注释的标记,则需要确保 新标记名引用的是基础提交,而不是旧的带注释的标记 要删除的对象。因此,使用
git标记-一个新的^{}
而不是
git tag new-old
(这是因为带注释的标记在
轻量级标记不是,)。

对于喜欢冒险的人,可以通过一个命令完成:

mv .git/refs/tags/OLD .git/refs/tags/NEW
除了其他答案外:

首先,需要构建旧标记名的别名,指向原始提交:

git tag new old^{}
然后您需要在本地删除旧的:

然后删除远程位置上的标记:

最后,您需要将新标记添加到远程位置。在完成此操作之前,不会添加新标记:

git push origin --tags
对每个远程位置重复此操作

请注意,对于包装的消费者来说,这是一个非常重要的问题

有一行有趣的句子,它提醒我们可以推几篇参考文献:

git push origin refs/tags/<old-tag>:refs/tags/<new-tag> :refs/tags/<old-tag> && git tag -d <old-tag>
git推送原点refs/tags/:refs/tags/:refs/tags/&&git-tag-d
并让其他克隆人做
git-pull--prune--tags

因此,我们的想法是推动:

  • 对于
    引用的每个提交:
    refs/tags/:refs/tags/
  • :refs/tags/

请参见“示例”。

作为其他答案的补充,我添加了一个别名,以便在一个步骤中完成所有操作,并使用了更熟悉的*nix move命令。参数1是旧标记名,参数2是新标记名

[alias]
    renameTag = "!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"
用法:

git renametag old new

您还可以在不签出远程标记的情况下重命名远程标记,方法是在单个
git push
命令中将旧标记/分支复制为新名称并删除旧标记

远程标记重命名/远程分支→ 标记转换:(注意:
:refs/tags/

输出重命名远程标记:

D:\git.repo>git push gitlab App%2012.1%20v12.1.0.23:refs/tags/App_12.1_v12.1.0.23 :App%2012.1%20v12.1.0.23

Total 0 (delta 0), reused 0 (delta 0)
To https://gitlab.server/project/repository.git
 - [deleted]               App%2012.1%20v12.1.0.23
 * [new tag]               App%2012.1%20v12.1.0.23 -> App_12.1_v12.1.0.23
Tag commit: 580f817
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: new
Tag message: Initial tag

Body line 1.
Body line 2.
Body line 3.

Tag commit: 30ddd25
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: old
Tag message: Initial tag

Body line 1.
Body line 2.
Body line 3.

无论推送标记和重命名已推送的标记时遇到什么问题,如果要重命名的标记是带注释的标记,则可以通过以下单行命令行首先复制它:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
然后,您只需删除旧标记:

git tag -d old_tag
由于以下两个答案,我找到了这个命令行:

  • (第二条评论)
编辑:
使用自动同步标记设置
fetch.pruetags=true
(如中所述)时遇到问题,我个人建议先在服务器上复制新标记,然后删除旧标记。这样,在删除旧标记时,新标记不会被随机删除,并且标记的同步将删除尚未在服务器上的新标记。例如,我们一起得到:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
git push --tags
git tag -d old_tag
git push origin :refs/tags/old_tag

对于一个或几个标记,请遵循3步方法

步骤1:标识当前标记指向的提交的提交/对象ID
命令:git rev parse
示例:git rev parse v0.1.0-Demo
输出示例:DB57B63B77A6BAE3E725CB9025D65FA1EABCDE
步骤2:从存储库中删除标记
命令:git标记-d
示例:git标签-dv0.1.0-Demo
输出示例:删除标签“v0.1.0-Demo”(是abcde)
步骤3:创建一个新标记,指向与旧标记指向的提交id相同的提交id
git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
git tag -d old_tag
git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
git push --tags
git tag -d old_tag
git push origin :refs/tags/old_tag
Tag commit: 580f817
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: new
Tag message: Initial tag

Body line 1.
Body line 2.
Body line 3.

Tag commit: 30ddd25
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: old
Tag message: Initial tag

Body line 1.
Body line 2.
Body line 3.