今天,我在查看一个项目的日志,发现我在前段时间发现了一个标签名。有什么方法可以重命名标记吗?谷歌没有发现任何有用的东西。
我意识到我可以检查标记的版本并制作一个新的标记,我甚至尝试过。但这似乎创建了一个不太正确的标记对象。例如,
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拉动不应该只是让他们覆盖旧标签。如果有人从你那里获得了发布标签,你不能通过更新自己的标签来更改他们的标签。这是一个很大的安全问题,因为人们必须能够信任自己的标签名。如果你真的想做这件疯狂的事,你需要坦白,告诉别人你搞砸了。
手册页的所有礼貌。
最初的问题是如何重命名标记,这很简单:首先创建NEW作为OLD:git标记NEW OLD的别名,然后删除OLD:git-tag-d OLD。
关于“Git方式”和(in)理智的引用是不正确的,因为它是在谈论保留标记名,但使其引用不同的存储库状态。
无论如何处理推送标记和重命名已推送的标记,如果要重命名的标记是带注释的标记,您可以首先通过以下单行命令行复制它:
git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
然后,您只需删除旧标记:
git tag -d old_tag
由于以下两个答案,我找到了此命令行:
https://stackoverflow.com/a/26132640/7009806(第二条评论)https://stackoverflow.com/a/49286861/7009806
编辑:使用自动同步标记设置fetch时遇到问题。prunTags=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
以下是我如何将标记从旧重命名为新:
git tag new old
git tag -d old
git push origin new :old
push命令中的冒号从远程存储库中删除标记。如果如果你不这样做,Git会在你的机器上创建旧标签。最后,确保其他用户删除删除的标记。请告诉我他们(同事)运行以下命令:
git pull --prune --tags
注意,如果要更改带注释的标记,则需要确保新标记名引用的是基础提交,而不是旧的带注释标记您要删除的对象。因此,使用git标记-一个新的旧^{}而不是git标记new-lold(这是因为带注释的标记是对象轻量级标签不是,更多信息在这个答案中)。
对于冒险者,只需一个命令即可完成:
mv .git/refs/tags/OLD .git/refs/tags/NEW