你如何重命名Git标签?

问题描述 投票:1087回答:10

今天我正在浏览一个项目的日志,并意识到我不久前发了一个标签名称。有没有办法重命名标签?谷歌没有发现任何有用的东西。

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

git tag -l

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

git git-tag
10个回答
1849
投票

以下是我将标签old重命名为new的方法:

git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

push命令中的冒号从远程存储库中删除标记。如果你不这样做,当你拉动时,Git会在你的机器上创建旧标签。

最后,确保其他用户删除已删除的标记。请告诉他们(同事)运行以下命令:

git pull --prune --tags

1
投票

简单的部分是重命名本地标签。更难的部分是远程部分。这个技巧背后的想法是将旧标签/分支复制到新标签/分支并删除旧标签/分支,而无需结帐。

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

git push <remote_name> <old_branch_or_tag>:refs/tags/<new_tag> :<old_branch_or_tag>

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

git push <remote_name> <old_branch_or_tag>:refs/heads/<new_branch> :<old_branch_or_tag>

输出重命名远程标记:

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

285
投票

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

关于“Git方式”和(in)完整性的引用是不合适的,因为它讨论的是保留标记名称,但使其引用不同的存储库状态。


107
投票

除了其他答案:

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

git tag new old^{}

然后你需要在本地删除旧的:

git tag -d old

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

# Check your remote sources:
git remote -v
# The argument (3rd) is your remote location,
# the one you can see with `git remote`. In this example: `origin`
git push origin :refs/tags/old

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

git push origin --tags

为每个远程位置迭代这个。

请注意,implications that a Git Tag change has给消费者一个包!


27
投票

如果它已发布,则无法将其删除(不会有被涂焦油和羽毛的风险)。 'Git方式'是:

理智的事情。只是承认你搞砸了,并使用不同的名字。其他人已经看过一个标签名称,如果你保持相同的名称,你可能会遇到两个人都有“版本X”的情况,但他们实际上有不同的“X”。所以只需称它为“X.1”并完成它。

或者,

疯狂的事情。你真的想把新版本称为“X”,即使其他人已经看过旧版本。所以再次使用git-tag -f,好像你还没有发布旧版本一样。

它太疯狂了,因为:

Git没有(也不应该)改变用户背后的标签。因此,如果有人已经获得旧标签,那么在树上进行git-pull不应该只是让它们覆盖旧标签。

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

所有礼貌的man pages


25
投票

This wiki page有这个有趣的单行,它提醒我们,我们可以推几个参考:

git push origin <refs/tags/old-tag>:<refs/tags/new-tag> :<refs/tags/old-tag> && git tag -d <old-tag>

并要求其他克隆人做git pull --prune --tags

所以想法是推动:

  • <new-tag>引用的所有提交的<old-tag>:<refs/tags/old-tag>:<refs/tags/new-tag>
  • the deletion of <old-tag>:<refs/tags/old-tag>

以“Change naming convention of tags inside a git repository?”为例。


25
投票

作为其他答案的补充,我添加了一个别名,只需一步即可完成所有操作,使用更熟悉的* 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

6
投票

对于喜欢冒险的人来说,可以在一个命令中完成:

mv .git/refs/tags/OLD .git/refs/tags/NEW

3
投票

无论有关推送标签和重命名已经推送的标签的问题如何,如果要重命名的标签是带注释的标签,您可以先复制它,这要归功于以下单行命令行:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}

然后,您只需删除旧标记:

git tag -d old_tag

由于以下两个答案,我找到了这个命令行:

编辑: 使用fetch.pruneTags=true的标签自动同步遇到问题(如https://stackoverflow.com/a/49215190/7009806中所述),我个人建议先在服务器上复制新标签,然后删除旧标签。这样,在删除旧标记时,新标记不会被随机删除,并且标记的同步将删除尚未在服务器上的新标记。所以,例如,我们一起得到:

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
投票

对于一个或几个标签,请遵循3步法。

步骤1:识别当前标记指向的提交的提交/对象ID

     command: git rev-parse <tag name>
     example: git rev-parse v0.1.0-Demo
     example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde

第2步:从存储库中删除标记

     command: git tag -d <tag name>
     example: git tag -d v0.1.0-Demo
     example output: Deleted tag 'v0.1.0-Demo' (was abcde)

步骤3:创建一个新标记,指向与旧标记指向的相同提交ID

     command: git tag -a <tag name>  -m "appropriate message" <commit id>
     example: git tag -a v0.1.0-full  -m "renamed from v0.1.0-Demo" db57b63b77a6bae3e725cbb9025d65fa1eabcde
     example output: Nothing or basically <No error>

一旦本地git准备好了标签名称更改,这些更改就可以推回原点,供其他人使用。

© www.soinside.com 2019 - 2024. All rights reserved.