你如何重命名一个Git标签?

今天,我正在浏览一个项目的日志,并意识到我胖了一段时间手指标签名称。 有没有办法重新命名标签? 谷歌还没有发现任何有用的东西。

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

git tag -l 

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

下面是我如何重新命名一个标签oldnew

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

push命令中的冒号从远程存储库中删除标签。 如果你不这样做,git会在你的机器上创build旧标签。

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

 git pull --prune --tags 

原来的问题是如何重新命名一个标签,这很简单:首先创buildNEW作为OLD的别名: tag NEW OLD然后删除OLD: tag -d OLD

关于“git way”和(in)完整性的引用是offbase,因为它是在讨论保存标签名称,但是使其指向不同的repo状态。

除了其他的答案:

首先,您需要构build标记名称的别名

 git tag new_tag_name old_tag_name 

那么你需要在本地删除旧的:

 git tag -d old_tag_name 

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

 # 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_tag_name 

最后,您需要将您的新标签添加到远程位置。 在您完成之前,新的标签将不会被添加:

 git push origin --tags 

迭代这个每个远程位置。

这个wiki页面有这个有趣的单行,这提醒我们,我们可以推动几个参考

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

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

所以这个想法是推动:

  • 对于由<old-tag >引用的每个提交, <new-tag><refs/tags/old-tag>:<refs/tags/new-tag>
  • 删除<old-tag> :<refs/tags/old-tag>

请参阅“ 更改git存储库中标记的命名规则? ”。

如果已发布,则无法将其删除(无需冒着被涂柏油和羽毛的风险)。 'git的方式'是这样做的:

理智的事情。 只要承认你搞砸了,就用不同的名字。 其他人已经看到了一个标签名,如果保持同名,可能是两个人都有“X版”,但实际上有不同的“X”。 所以把它叫做“X.1”,然后用它来完成。

或者,

疯狂的事情。 即使其他人已经看到了旧版本,你也确实想叫新版本“X”。 所以再次使用git-tag -f,就好像你还没有发布旧的。

这是如此疯狂,因为:

Git没有(也不应该)改变用户背后的标签。 所以,如果有人已经拿到了旧标签,那么在树上做一个混帐就不应该把它们改写成旧标签。

如果有人从你那里得到一个释放标签,你不能只更新自己的标签。 这是一个很大的安全问题,因为人们必须能够信任他们的标签名称。 如果你真的想要做这个疯狂的事情,你只需要做出决定,告诉别人你搞砸了。

所有礼貌的手册页

作为对其他答案的补充,我添加了一个别名,可以一步完成所有操作,并带有更为熟悉的* nix移动命令。 参数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 

冒险可以通过一个命令完成:

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

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

远程标签重命名/远程分支→标签转换:(注意: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