你如何重命名一个Git标签?
今天,我正在浏览一个项目的日志,并意识到我胖了一段时间手指标签名称。 有没有办法重新命名标签? 谷歌还没有发现任何有用的东西。
我意识到我可以检查出标签的版本,并制作一个新的标签,我甚至尝试过。 但是,这似乎创build了一个不太正确的标签对象。 首先,
git tag -l
相对于所有其他标签,按顺序排列。 我不知道这是否意义重大,但是让我相信新的标签对象不是我想要的。 我可以忍受这一点,因为我真的只关心标签名称与文档匹配,但我宁愿这样做“正确”,假设有一个正确的方法来做到这一点。
下面是我如何重新命名一个标签old
到new
:
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