今天,我在查看一个项目的日志,发现我在前段时间发现了一个标签名。有什么方法可以重命名标记吗?谷歌没有发现任何有用的东西。
我意识到我可以检查标记的版本并制作一个新的标记,我甚至尝试过。但这似乎创建了一个不太正确的标记对象。例如,
git tag -l
列出了它相对于所有其他标记的顺序。我不知道这是否有意义,但这让我相信新的标记对象并不是我想要的。我可以接受这一点,因为我真的只关心标记名是否与文档匹配,但我宁愿“正确”地做,假设有正确的方法可以做到这一点。
今天,我在查看一个项目的日志,发现我在前段时间发现了一个标签名。有什么方法可以重命名标记吗?谷歌没有发现任何有用的东西。
我意识到我可以检查标记的版本并制作一个新的标记,我甚至尝试过。但这似乎创建了一个不太正确的标记对象。例如,
git tag -l
列出了它相对于所有其他标记的顺序。我不知道这是否有意义,但这让我相信新的标记对象并不是我想要的。我可以接受这一点,因为我真的只关心标记名是否与文档匹配,但我宁愿“正确”地做,假设有正确的方法可以做到这一点。
当前回答
如果它已经发布,你就不能删除它(不冒被涂上柏油和羽毛的风险)。“Git方式”是:
理智的事情。承认你搞砸了,换个名字。其他人已经看到了一个标签名称,如果你保持相同的名称,你可能会遇到这样的情况:两个人都有“版本X”,但实际上他们有不同的“X”。所以只要叫它“X.1”就行了。
或者,
疯狂的事情。你真的想把新版本称为“X”,尽管其他人已经看到了旧版本。所以只需再次使用git标记-f,就像您还没有发布旧的一样。
这太疯狂了,因为:
Git不会(也不应该)在用户背后更改标签。因此,如果有人已经得到了旧标签,那么在你的树上做一个git拉动不应该只是让他们覆盖旧标签。如果有人从你那里获得了发布标签,你不能通过更新自己的标签来更改他们的标签。这是一个很大的安全问题,因为人们必须能够信任自己的标签名。如果你真的想做这件疯狂的事,你需要坦白,告诉别人你搞砸了。
手册页的所有礼貌。
其他回答
如果它已经发布,你就不能删除它(不冒被涂上柏油和羽毛的风险)。“Git方式”是:
理智的事情。承认你搞砸了,换个名字。其他人已经看到了一个标签名称,如果你保持相同的名称,你可能会遇到这样的情况:两个人都有“版本X”,但实际上他们有不同的“X”。所以只要叫它“X.1”就行了。
或者,
疯狂的事情。你真的想把新版本称为“X”,尽管其他人已经看到了旧版本。所以只需再次使用git标记-f,就像您还没有发布旧的一样。
这太疯狂了,因为:
Git不会(也不应该)在用户背后更改标签。因此,如果有人已经得到了旧标签,那么在你的树上做一个git拉动不应该只是让他们覆盖旧标签。如果有人从你那里获得了发布标签,你不能通过更新自己的标签来更改他们的标签。这是一个很大的安全问题,因为人们必须能够信任自己的标签名。如果你真的想做这件疯狂的事,你需要坦白,告诉别人你搞砸了。
手册页的所有礼貌。
作为对其他答案的补充,我添加了一个别名,用更熟悉的*nixMove命令感觉一步完成所有操作。参数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/)
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
最初的问题是如何重命名标记,这很简单:首先创建NEW作为OLD:git标记NEW OLD的别名,然后删除OLD:git-tag-d OLD。
关于“Git方式”和(in)理智的引用是不正确的,因为它是在谈论保留标记名,但使其引用不同的存储库状态。
这个wiki页面有一个有趣的单行线,它提醒我们可以推送几个参考:
git push origin refs/tags/<old-tag>:refs/tags/<new-tag> :refs/tags/<old-tag> && git tag -d <old-tag>
并要求其他克隆器执行git pull-prune标记
因此,我们的想法是:
<new tag>对于<old tag>:refs/tags/<old tag>:refs/tags/<new tag>引用的每个提交,删除<旧标签>::refs/tags/<旧标签>
请参见示例“更改git存储库中标记的命名约定?”。