如何在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"