今天,我在日志中寻找一个项目,并意识到一段时间前我已经用了一个胖胖的标签名。 有什么办法可以重命名标签? Google并未提供任何有用的信息。
我意识到我可以签出加标签的版本并制作一个新标签,我什至尝试了。 但这似乎创建了一个不太正确的标记对象。 一方面
git tag -l
相对于所有其他标签无序列出它。 我不知道这是否有意义,但是这让我相信新的标记对象并不是我想要的。 我可以忍受,因为我真的只在乎标记名称是否与文档匹配,但是我宁愿“正确”地进行操作,前提是有正确的方法。
如果已发布,则不能将其删除(也就是说,不必冒被涂焦油和羽毛的危险)。 “ Git方式”是:
理智的事情。 只要承认您搞砸了,并使用其他名称即可。 其他人已经看到了一个标记名,如果您使用相同的名称,则可能是两个人都有“ X版本”,但实际上却有不同的“ X”。 因此,只需将其称为“ X.1”即可完成。
或者,
疯了 您真的也想将新版本称为“ X”,即使其他人已经看到了旧版本。 因此,只需再次使用git-tag -f,就好像您尚未发布旧版本一样。
太疯狂了,因为:
Git不会(也不应该)更改用户背后的标签。 因此,如果有人已经获得了旧标签,那么在您的树上执行git-pull不仅要使他们覆盖旧标签。
如果有人从您那里获得了发行标签,则您不能仅仅通过更新自己的标签来为其更改标签。 这是一个很大的安全问题,因为人们必须能够信任他们的标记名。 如果您真的想做疯狂的事情,则需要认真地做,然后告诉别人您搞砸了。
所有礼貌的手册页 。
对于喜欢冒险的人,可以通过以下命令完成:
mv .git/refs/tags/OLD .git/refs/tags/NEW
除了其他答案:
首先,您需要构建旧标记名的别名 ,指向原始提交:
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
遍历每个远程位置。
请注意, 更改Git标签对包装的消费者有何影响 !
最初的问题是如何重命名标签,这很容易:首先创建NEW作为OLD的别名: git tag NEW OLD
然后删除OLD: git tag -d OLD
。
关于“ Git方式”和(理智)理智的报价是不合时宜的,因为它是在谈论保留标签名称,但是使其指向不同的存储库状态。
这个Wiki页面具有这个有趣的单行代码,它提醒我们可以推送多个参考 :
git push origin : : && git tag -d
并要求其他克隆者执行
git pull --prune --tags
因此,想法是推动:
通过引用的每个提交 >: :
,
:
参见示例“ 在git存储库中更改标签的命名约定? ”。
作为其他答案的补充,我添加了一个别名以一步完成所有操作,并具有更熟悉的* 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
最简单的部分是重命名本地标签。 较难的部分是远程部分。 此技巧背后的想法是将旧标签/分支复制到新标签/分支,然后删除旧标签/分支,而不进行检出。
远程标记重命名/远程分支→标记转换:(注意:refs/tags/
)
git push :refs/tags/ :
远程分支重命名/远程标记→分支转换:(注意:refs/heads/
)
git push :refs/heads/ :
输出重命名远程标签:
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
不管处理推送标签和重命名已经推送的标签有什么问题,如果要重命名的标签是带注释的标签,您都可以通过以下单行命令行首先将其复制:
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步方法。
command: git rev-parse
example: git rev-parse v0.1.0-Demo
example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde
command: git tag -d
example: git tag -d v0.1.0-Demo
example output: Deleted tag 'v0.1.0-Demo' (was abcde)
command: git tag -a -m "appropriate message"
example: git tag -a v0.1.0-full -m "renamed from v0.1.0-Demo" db57b63b77a6bae3e725cbb9025d65fa1eabcde
example output: Nothing or basically
一旦本地git做好了标记名称更改的准备,就可以将这些更改推回原点,以供其他人使用。
这是我将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
请注意, 如果要更改带注释的标记 ,则需要确保新标记名称引用的是基础提交,而不是要删除的旧带注释的标记对象。 因此,请使用git tag -a new old^{}
代替git tag new old
(这是因为带注释的标签是对象,而轻量级的标签不是对象, 有关此信息,请参阅 )。