如何在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消息。 任何人都知道我们会怎样做呢?

git tag <tag name> <tag name> -f -m "<new message>"

这将创build一个具有相同名称的新标签(通过覆盖原来的)。

要更新复杂的消息,只需使用-a指定带注释的标记选项或使用-s指定带标记的标记选项即可:

 git tag <tag name> <tag name> -f -a 

这将打开一个编辑器与您的旧标签消息的内容

git tag <tag name> <tag name>^{} -f -a

这是Andy和Eric Hu的回答的一个改进。 他们的答案将创build一个新的标签对象,引用旧的标签对象,他们两个将具有相同的标签名称。

<tag name>^{}将parsing标签/引用,直到find第一个提交哈希。

TL; DR

您可以通过删除标签并在欺骗date和作者时重新创build该标签来完成此操作:

 > git tag -d <tag-name> > [GIT_COMMITTER_DATE=<original-commit-date>] \ > [GIT_AUTHOR_NAME=<original-author-name>] \ > git tag <tag-name> [commit] 

整个故事:

build立在Sungram的答案(最初是作为编辑提出的):

1.接受的答案

这是对安迪和胡适的回答的一个改进。 他们的答案将创build一个新的标签对象,引用旧的标签对象,并将具有相同的名称。

为了说明这一点,请考虑以下几点:

 > git tag tag1 tag1 -f -a # accepted answer > git rev-list --objects -g --no-walk --all [ example output: ] 6bdcc347fca041a5138f89fdf5276b3ebf9095d5 260ab7928d986472895b8c55e54569b3f3cb9517 tag1 a5797673f610914a45ef7ac051e3ee831a6e7c25 tag1 f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 > git show tag1 tag tag1 Tagger: [tagger] Date: [date of updated tag] [Updated description] tag tag1 Tagger: [tagger] Date: [date of original tag] [Original description] [tagged commit details] 

Sungram的改进

使用<tag name>^{}作为git tag的第二个参数将删除所有以前具有相同名称的标签。

考虑前一届terminal会议的延续:

 > git tag tag1 tag1^{} -f -a # suggested improvement > git rev-list --objects -g --no-walk --all [ example output: ] 6bdcc347fca041a5138f89fdf5276b3ebf9095d5 75f02acacfd7d91d55b5bcfdfb1f00aebeed15e3 tag1 f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 > git show tag1 tag tag1 Tagger: [tagger] Date: [date of updated tag] [Updated description] [tagged commit details] 

3.保存date

最后,如果你想保留原始标签的date作为更新标签的date,使用一些awk(或类似的)魔术,或者只是粘贴你想要的date。 以下是第二个例子的替代 (否则原始date将由于重写而丢失):

 > GIT_COMMITTER_DATE="$(git show tag1 | # get info about the tag cascade including the date original of the original tag > awk '{ > if ($1 == "Date:") { > print substr($0, index($0,$3)) > } > }' | # extract all the dates from the info > tail -2 | head -1)" `# get the second to last date, as the last one is the commit date` \ > git tag tag1 tag1^{} -a -f # finally, update the tag message, but save the date of the old one > > git rev-list --objects -g --no-walk --all 6bdcc347fca041a5138f89fdf5276b3ebf9095d5 e18c178f2a548b37799b100ab90ca785af1fede0 tag1 f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 > git show tag1 tag tag1 Tagger: [tagger] Date: [date of original tag] [Updated description] [tagged commit details] 

参考文献:

  • SO:快速列出git数据库中的对象

  • SO:更改git标签的提交者date

  • Awk:教程和介绍

  • SO:通过first-token-of-line过滤输出,并用awk提取其余行

  • SO:如何在多行命令中joinbash行注释

4. DIY

或者更新标签,您可以删除它们并重新创build它们。 事实certificate,更新只是添加一个新的标签,并使其指向旧的标签,或者,只是隐式地删除旧标签,并创build一个新的标签指向相同的提交。

你可以通过发出:

 > git tag -d <tag-name> > [GIT_COMMITTER_DATE=<original-commit-date>] \ > [GIT_AUTHOR_NAME=<original-author-name>] \ > git tag <tag-name> [commit] 

这里[optional]是一个可选字段; <required>是必填字段。 当然,你可以在通常的git tag命令之后添加任何标志。

@Andy的解决scheme

 git tag <tag-name> <tag-name> -f -a 

错的 之后,与

 git show 

命令,我们将看到具有相同名称的堆栈标记。

它在commit <tag-name>处添加一个具有相同标签名称和新消息的新标签。 但它不会删除旧标签。 这是这个命令的特例:

 git tag [<commit> | <old-tag>] <tag-name> 

但是<old-tag><tag-name>是一样的。


正确的解决scheme很简单,只需更新标签即可。

 git tag <tag-name> -f -a 

记住,这里只有一个

如果我们想要改变标签,这不是HEAD ,我们需要一个额外的<commit>参数。

 git tag <commit> <tag-name> -f -a 

使用上面的答案,这是我的别名.gitconfig 。 replace现有标记并保留提交date。

 [alias] tm = "!sh -c 'f() { export GIT_COMMITTER_DATE=$(git log -1 --format=%ci $0); git tag -f -a $0 $0^{}; }; f '" 

改进?

您将不得不使用-f强制标志再次标记。

 git tag v1.0 -f -m "actual message"