如何在 Git 中编辑现有标签消息?
我们的 Git 存储库中有几个带注释的标签。旧标签包含虚假消息,我们希望将其更新为新样式。
% git tag -n1
v1.0 message
v1.1 message
v1.2 message
v2.0 Version 2.0 built on 15 October 2011.
在此示例中,我们希望使 v1.x 消息看起来像 v2.0 消息。我们该怎么做呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
这将创建一个具有相同名称的新标签(通过覆盖原始标签)。
This will create a new tag with the same name (by overwriting the original).
要更新复杂消息,只需使用
-a
指定带注释的标签选项或使用-s
指定签名标签选项:这将打开一个编辑器,其中包含以下内容您的旧标签消息。
To update a complex message, just specify the annotated tag option with
-a
or the signed tag option with-s
:This will open an editor with the contents of your old tag message.
git tag <标签名称>; <标签名称>^{} -f -a
这是一项改进:如果没有
^{}
,它将创建一个引用旧标签对象的新标签对象,其中两者将具有相同的标签名称。<标签名称>^{}
将解析标签/引用,直到找到第一个提交哈希。git tag <tag name> <tag name>^{} -f -a
This is an improvement: without
^{}
it will create a new tag object that reference the old tag object, where both of them will have the same tag name.<tag name>^{}
will resolve the tag/reference until it finds the first commit hash.TL;DR
您可以通过删除标签并重新创建它,同时欺骗日期和作者来做到这一点:
整个故事:
基于 Sungram 的答案(最初作为编辑提出):
1. 接受的答案
这是对 安迪和胡志明的答案。
他们的答案将创建一个引用旧标签对象的新标签对象,并且两者将具有相同的名称。
为了说明这一点,请考虑以下内容:
2. Sungram 的改进
使用
^{}
作为git tag
的第二个参数将删除所有以前的标签同名。考虑上一个终端会话的延续:
3. 保存日期
最后,如果您想将原始标签的日期保留为更新标签的日期,请使用一些 awk (或类似的)魔术或仅粘贴您想要的日期反而。以下是第二个示例的替代(否则原始日期将因覆盖而丢失):
参考文献:
SO:快速列出 git 数据库中的对象
SO:更改 git 标签的提交者日期
Awk:教程和介绍
SO:按第一个标记过滤输出并使用 awk 提取其余行
SO:如何在多行命令中添加 bash 行注释
4. DIY
除了更新标签之外,您还可以删除它们并重新创建它们。事实证明,更新只是添加一个新标签并使其指向旧标签,或者只是隐式删除旧标签并创建一个新标签以指向相同的提交。
您可以通过发出以下命令来实现此目的:
这里
[可选]
是可选字段;
是必填字段。当然,您可以像平常一样在 git tag 命令后添加任何标志。
TL;DR
You can do this by deleting your tag and recreating it while spoofing the date and author:
Whole story:
Building on Sungram's answer (originally proposed as an edit):
1. Accepted answer
This is an improvement over Andy and Eric Hu's answers.
Their answers will create a new tag object that references the old tag object and both are going to have the same name.
To illustrate this, consider the following:
2. Sungram's improvement
Using
<tag name>^{}
as the second argument ofgit tag
will instead delete all previous tags with the same name.Consider the continuation of the previous terminal session:
3. Save the date
Lastly, if you want to keep the date of the original tag as the date of the updated tag, use some awk (or similar) magic or just paste the date you want instead. The following is a substitute for the second example (otherwise the original date would be lost due to overriding):
References:
SO: Quick listing objects in git database
SO: Change the committer date of a git tag
Awk: A tutorial and introduction
SO: Filter output by first-token-of-line and extract rest-of-line with awk
SO: How to put bash line comment in a multi-line command
4. DIY
Alternatively to updating the tags, you can just delete them and create them again. As it turns out updating just adds a new tag and makes it point to the old one, or alternatively, just implicitly deletes the old one and creates a new one to point to the same commit anyway.
You can achieve this by issuing:
Here
[optional]
is an optional field;<required>
is a required field.Of course, you can add any flags after the
git tag
command that you normally would.@Andy 2016 年的原始解决方案(最终更新)
是错误。之后,使用
命令,我们将看到具有相同名称的堆栈标签。
它在提交时添加具有相同标签名称的新标签和新消息
。但它不会删除旧标签。这是此命令的特例:但只是
与
相同。正确的解决办法很简单,只需更新tag就可以了。
请记住,这里只有一个。
如果我们想要更改标签(不是
HEAD
),我们需要一个额外的
参数。@Andy's original solution from 2016 (which was eventually updated)
is wrong. After it, with
command, we will see stack tags with same name.
It add a new tag with same tag name and new message at commit
<tag-name>
. But it don't remove old tag. It's a special case of this command:But just
<old-tag>
is same with<tag-name>
.Correct solution is simple, just update tag is OK.
Remember, only ONE here.
If we want change tag, which isn't
HEAD
, we need an extra<commit>
argument.使用 Git 2.17(2018 年第 2 季度),将有另一种方法可以使用
git tag新标签名称> <标签名称> -f -m ""
,因为“git tag
”学习了显式“--edit
”选项 允许进一步编辑通过“-m
”和“-F
”给出的消息。请参阅 提交 9eed6e4(2018 年 2 月 6 日),作者:尼古拉斯莫雷-蔡斯马丁 (
nmorey
)。(由 Junio C Hamano --
gitster
-- 合并于 提交 05d290e,2018 年 3 月 6 日)With Git 2.17 (Q2 2018), there will be an alternative to creating a new tag with
git tag <tag name> <tag name> -f -m "<new message>"
, since "git tag
" learned an explicit "--edit
" option that allows the message given via "-m
" and "-F
" to be further edited.See commit 9eed6e4 (06 Feb 2018) by Nicolas Morey-Chaisemartin (
nmorey
).(Merged by Junio C Hamano --
gitster
-- in commit 05d290e, 06 Mar 2018)您必须使用
-f
强制标志再次标记。You will have to tag again, using the
-f
force flag.使用上面的答案(尤其是Sungam的),这是我的
.gitconfig
的别名one-liner 。替换现有标签并保留提交日期。改进?
Using the answers above (especially Sungam's), this is my alias one-liner for
.gitconfig
. Replaces existing tag and preserves the commit date.Improvements?
这就是我在 Github 标签页面中使用“RAMDOM 描述”成功更新标签消息号 54.4 的方法:
This is how I updated successfully a tag's message number 54.4 with a "RAMDOM DESCRIPTION" in the Github tags page:
如果您使用像 smartgit 这样的 GUI,只需
If you are using a GUI like smartgit just
这里有一组别名,应该根据现有的答案(特别是stanm的)为您完成此操作:
这些别名接受单个标签名称和 git 标签的任何其他标志也可以很容易地进行修改以支持名称更改。
用法:
支持轻量级标签
使用
creatordate
、creatorname
和creatoremail
而不是tagger...
变体。creator...
快捷方式将使用tagger...
(如果存在)并回退到committer...
。Here's a set of aliases that should do it for you based on the existing answers (especially stanm's) here:
These aliases accept a single tag name and any other flags to git tag and can be modified to support name changes pretty easily as well.
Usage:
Support for light-weight tags
Use
creatordate
,creatorname
, andcreatoremail
instead of thetagger...
variants. Thecreator...
shortcuts will usetagger...
if it exists and fallback tocommitter...
.