关于git标签:如何重命名Git标签? 您所在的位置:网站首页 github能改名吗 关于git标签:如何重命名Git标签?

关于git标签:如何重命名Git标签?

#关于git标签:如何重命名Git标签? | 来源: 网络整理| 查看: 265

今天,我在日志中寻找一个项目,并意识到一段时间前我已经用了一个胖胖的标签名。 有什么办法可以重命名标签? Google并未提供任何有用的信息。

我意识到我可以签出加标签的版本并制作一个新标签,我什至尝试了。 但这似乎创建了一个不太正确的标记对象。 一方面

1git tag -l

相对于所有其他标签无序列出它。 我不知道这是否有意义,但是这让我相信新的标记对象并不是我想要的。 我可以忍受,因为我真的只在乎标记名称是否与文档匹配,但是我宁愿"正确"地进行操作,前提是有正确的方法。

相关讨论 您是否使用了相同的调用,即,如果旧标签是带注释/签名的标签,新标签还是这种标签,还是轻量级标签? 错误的旧标签和所需的新标签都应进行注释和未签名。 旧标签是使用git标签-a bad_tag_name创建的,因此我想按照git标签-a good_tag_name的方式进行操作。 我应该指出,我也希望这个神奇的标签重命名过程能够保留正在重命名的标签中的注释。 实际上,我真的很想更改名称,而别无其他。 git log --oneline --decorate --graph在清理标签时很有帮助。 您可以在一行中重命名标签:请在下面查看我的答案

这是将标签old重命名为new的方法:

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

push命令中的冒号将从远程存储库中删除标记。如果您不这样做,当您拉时,Git将在您的机器上创建旧标签。

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

1git pull --prune --tags 相关讨论 如果标记了注释,则新标记将不会包含旧标记的消息,但它会提供有用的信息 @NickSoft,我只是使用带注释的标签完成了上述操作。消息从旧复制到新就好了。也许我有较新版本的git? 要注意的一件事是,如果使用git tag new old,则当" old"不是轻量级标签时," old"会使其进入" new"标签。为此,请尝试:git tag -m tralala old; git tag new old; git tag -d old; git cat-file tag new | grep old。那是因为"新"指向"旧"标记,而不是提交"旧"指向。 我认为git push origin :refstagsold可以简化为git push origin :old。 我建议更改" git push --tags"以使其更明确地表示此标签" git push origin refs / tags / new"。您不希望无意间推送其他标签。 出色的回答,谢谢。我是否可以建议将git tag new old更改为git tag new tagsold,因为这更明确地指向旧标记而不是其他标记? 保存标签消息怎么样?你丢了 为了添加到@chrish注释中,--tags包含了可能不想要的带注释的标签和轻量标签。按下重命名标签即可使用git push origin [new-tag-name] 当new和old仅大写字母不同时(例如V1和V1),这似乎不起作用。在这种情况下,删除命令将删除两个标签。可以通过使用中间标记名称来解决此问题。 @vitalii此方法应将消息保留在带注释的标签中。 当前版本的git(我有2.8)似乎可以正确复制标签元数据,包括原始标签作者,创建时间戳和消息。 我相信我正确地遵循了这些步骤,但是git pull --prune --tags并没有摆脱其他版本的仓库中的旧标签,我仍然不得不在那里明确地删除它们。使用git 2.8.3 除非我在第一个命令后添加git push origin --tags,否则在本地和远程删除旧标签时会丢失新标签吗? 执行git pull --prune --tags时,必须确保您位于远程存储库中已列出的分支上。否则,您将收到警告,提示您的分支没有跟踪信息。因此,请首先签出一个分支,该分支已在您希望的来源远程列出。 实际上,您现在应该使用git fetch --tags而不是git pull --prune --tags 警告:使用git tag new old将创建指向旧标签的标签,而不是旧标签提交。 (请参阅为什么我不能从Git GUI签出我的标签?) 要从遥控器上删除旧标签,您也可以执行git push -d [remote] [tag]。 confluence.atlassian.com/bitbucket/对我也有帮助。

最初的问题是如何重命名标签,这很容易:首先创建NEW作为OLD:git tag NEW OLD的别名,然后删除OLD:git tag -d OLD。

关于" Git方式"和(理智)理智的报价是不合时宜的,因为它是在谈论保留标签名称,但是使其指向不同的存储库状态。

相关讨论 上面的答案稍微有点可取,因为它包含git push origin业务。 最简单的方法,可以很好地重命名使用Gitflow创建的先前发行标签 警告:使用git tag new old将创建指向旧标签的标签,而不是旧标签提交。 (请参阅为什么我不能从Git GUI签出我的标签?)

除了其他答案:

首先,您需要构建旧标记名的别名,指向原始提交:

1git tag new old^{}

然后,您需要在本地删除旧的:

1git tag -d old

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

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

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

1git push origin --tags

遍历每个远程位置。

请注意,更改Git标签对包装的消费者有何影响!

相关讨论 警告:使用git tag new old将创建指向旧标签的标签,而不是旧标签提交。 (请参阅为什么我不能从Git GUI签出我的标签?) @StevenVascellaro感谢您的链接。下一次,请进行编辑-回答也是社区的努力。谢谢。 我尚未进行修改,因为我尚未为自己测试代码。 (注意链接问题的提交日期) 一旦执行git tag new old^{},则不需要git tag new_tag_name old_tag_name(第一步)。 好的,我测试并编辑了答案。

如果已发布,则不能将其删除(也就是说,不必冒被涂焦油和羽毛的危险)。" Git方式"是:

The sane thing. Just admit you screwed up, and use a different name. Others have already seen one tag-name, and if you keep the same name, you may be in the situation that two people both have"version X", but they actually have different"X"'s. So just call it"X.1" and be done with it.

或者,

The insane thing. You really want to call the new version"X" too, even though others have already seen the old one. So just use git-tag -f again, as if you hadn't already published the old one.

太疯狂了,因为:

Git does not (and it should not) change tags behind users back. So if somebody already got the old tag, doing a git-pull on your tree shouldn't just make them overwrite the old one.

If somebody got a release tag from you, you cannot just change the tag for them by updating your own one. This is a big security issue, in that people MUST be able to trust their tag-names. If you really want to do the insane thing, you need to just fess up to it, and tell people that you messed up.

全部由手册页提供。

相关讨论 或者,您可以标记(使用正确的名称)此错误命名的标记。 谢谢,我已经翻阅了该手册页一百万次。幸运的是,不良标签尚未在任何地方发布。即使是这样,这也是一个内部项目,而Im是目前唯一的开发人员。我认为我可以安全地进行脱毛和羽化操作,但前提是我可以得到与文档匹配的回购协议。 有时,我会将标记用作自己的个人参考。例如。它可能是ok_jb标签。我之所以使用它,是因为与我一起工作的某些人无法针对我的平台进行构建,因此有时会出现构建错误。然后,通过签出该标签,我可以快速获得构建的版本。构建新源时,我只需移动标签,或者将其重命名为builds ##,其中##是数字(取决于项目)。我还可以通过添加标签来强调引入特殊功能的时间。 可怜的答案。"不做"永远不是"我怎么做?"的正确答案。用户并没有询问您是否认为这样做是个好主意,还是人们会喜欢这样做。如果有人问"我该如何切断我的手",要么告诉他如何做,要么不理他,但他不需要别人告诉他割手可能不是一个好主意。而且您可以做到。您可以添加新标签,也可以删除旧标签,即使在远程存储库中,从技术上讲,也可以删除旧标签。 这似乎回答了以下问题:"如何使现有标签指向其他修订版?"而不是操作人员的问题,"如何重命名标签?"还不清楚如何告诉别人您搞砸了将如何解决问题(尽管通常来说这是一个好主意)。

作为其他答案的补充,我添加了一个别名以一步完成所有操作,并具有更熟悉的* nix move命令感觉。参数1是旧标签名,参数2是新标签名。

12[alias]     renameTag ="!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"

用法:

1git renametag old new 相关讨论 这对我不起作用,因为它在!sh处失败(有关Windows Git的问题),但是,将格式更新为以下格式后,它起作用了:renametag ="!f() { git tag $2 $1; git tag -d $1; git push origin :refstags$1; git push --tags; }; f"。

该Wiki页面具有这一有趣的单行代码,它提醒我们可以推送多个参考:

1git push origin : : && git tag -d

and ask other cloners to do git pull --prune --tags

因此,想法是推动:

对于>: :引用的每个提交, 的删除::

参见示例"在git存储库中更改标签的命名约定吗?"。

相关讨论 这会保留注释吗? @BrandonFosdick是的,它适用于带注释的标签。 请注意,这会将原始标签名称留在带注释标签的注释中!!我不确定这是否实际上意味着什么,至少在当前版本中。 @gbr您可以使用显示注释中剩余"原始标签名称"的示例来编辑答案吗? @VonC我不确定我明白你的要求;也许我不太清楚:注释对象包含一个设置为标签名称的标签字段,您可以使用git cat-file -p 看到它;在我的系统上使用您的方法时,我确实获得了已重命名的标记ref(),但其标记字段仍为。 @gbr是OP想要的吗? 他提到"我应该指出的是,我还希望这个神奇的标签重命名过程能够保留正在重命名的标签中的注释。实际上,我真的很想更改名称,而无需更改其他任何东西"(stackoverflow.com/questions/1028649/怎么办 - 你 - 重命名-A-git的标签/)

对于一个或几个标签,请遵循3步方法。

步骤1:确定当前标签指向的提交的提交/对象ID

123     command: git rev-parse      example: git rev-parse v0.1.0-Demo      example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde

步骤2:从存储库中删除标签

123     command: git tag -d      example: git tag -d v0.1.0-Demo      example output: Deleted tag 'v0.1.0-Demo' (was abcde)

第3步:创建一个新标签,指向与旧标签所指向的提交ID相同的提交ID

123     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做好了标记名称更改的准备,就可以将这些更改推回原点,以供其他人使用。

对于喜欢冒险的人,可以通过以下命令完成:

1mv .git/refs/tags/OLD .git/refs/tags/NEW 相关讨论 如果您的裁判已经打包,即如果您最近运行git gc,这将不起作用 这也只会影响本地回购。如果您配置了远程服务器,我不确定这可能导致什么负面影响。我不推荐这种方法。 还要注意的是,对于带注释的标签,这可能会更加麻烦,因为除其他外,注释blob包含标签的原始名称。实际上,我不知道这是否被任何东西使用(希望至少可以通过verify-tag使用),但是我不会冒险。 @gbr可以正常工作。(当然,要考虑@forivall的注释。)这个技巧在ALT Sisyphus构建系统中已被广泛使用。查看软件包的来源如何存储,例如:git.altlinux.org/gears/g/gear.git。诸如2.0.7-alt1之类的可读标签是维护者提交给构建系统的签名标签。构建系统将隐含标签gb-sisyphus-task164472.200放在此处,以跟踪已从该源构建并发布了pkg的任务ID。它们是哑副本(cp),维护者消息未更改。 @ imz--IvanZakharyaschev很高兴知道,尽管将来它不会带来某些产品问题,但我不会太信任它。没有真正的git仓库格式规范和预期的交互作用,因此,在可行的情况下,我将努力以最令人惊讶的方式干净利落地进行操作 简单。没有副作用。在本地标签上对我来说效果很好。

不管处理推送标签和重命名已经推送的标签有什么问题,如果要重命名的标签是带注释的标签,您都可以通过以下单行命令行首先将其复制:

1git tag -a -m"`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}

然后,您只需要删除旧标签:

1git tag -d old_tag

由于以下两个答案,我找到了此命令行:

https://stackoverflow.com/a/26132640/7009806(第二条评论) https://stackoverflow.com/a/49286861/7009806

编辑: 使用标签设置fetch.pruneTags=true的自动同步时遇到问题(如https://stackoverflow.com/a/49215190/7009806中所述),我个人建议首先在服务器上复制新标签,然后删除旧标签。这样,在删除旧标签时,新标签不会被随机删除,并且标签的同步会删除服务器上尚未存在的新标签。因此,例如,我们在一起得到:

1234git 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

最简单的部分是重命名本地标签。较难的部分是远程部分。 此技巧背后的想法是将旧标签/分支复制到新标签/分支,然后删除旧标签/分支,而不进行检出。

远程标记重命名/远程分支→标记转换:(注意::refs/tags/)

1git push :refs/tags/ :

远程分支重命名/远程标记→分支转换:(注意::refs/heads/)

1git push :refs/heads/ :

输出重命名远程标签:

123456D:\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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有