我们的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消息。有人知道我们将如何做吗?
fatal: tag 'v6.6.2' already exists
使用接收2.17.0
。
我们的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消息。有人知道我们将如何做吗?
fatal: tag 'v6.6.2' already exists
使用接收2.17.0
。
Answers:
git tag <tag name> <tag name>^{} -f -m "<new message>"
这将创建一个具有相同名称的新标签(覆盖原始标签)。
git tag --help
。
git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
您可以通过删除标签并在欺骗日期和作者的同时重新创建标签来做到这一点:
> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]
基于Sungram的答案(最初建议作为编辑):
这是对Andy和Eric Hu的改进的答案。他们的答案将创建一个引用旧标签对象的新标签对象,并且两者都将具有相同的名称。
为了说明这一点,请考虑以下内容:
> 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]
使用<tag name>^{}
作为第二个参数git tag
具有相同的名称将改为删除所有以前的标签。
考虑上一个终端会话的继续:
> 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]
最后,如果您想将原始标签的日期保留为更新标签的日期,请使用awk(或类似方法)魔术或粘贴所需日期。以下内容替代了第二个示例(否则原始日期将由于覆盖而丢失):
> 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]
参考文献:
除了更新标签之外,您还可以删除它们并重新创建。事实证明,更新只是添加了一个新标记并使其指向旧标记,或者备选地,只是隐式删除了旧标记并创建了一个新标记以始终指向同一提交。
您可以通过发出以下命令来实现:
> 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
通常的命令后添加任何标志。
The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
@Andy的解决方案
git tag <tag-name> <tag-name> -f -a
是错误的。之后,用
git show
命令,我们将看到具有相同名称的堆栈标签。
它将在提交时添加具有相同标签名称的新标签和新消息<tag-name>
。但是,它不会删除旧标签。这是此命令的特例:
git tag [<commit> | <old-tag>] <tag-name>
但<old-tag>
与一样<tag-name>
。
正确的解决方法很简单,只需更新标签即可。
git tag <tag-name> -f -a
记住, 这里只有一个。
如果我们想要更改标记(不是)HEAD
,则需要一个额外的<commit>
参数。
git tag <commit> <tag-name> -f -a
git show <tag>
看到了所有以前的版本。
HEAD
传递多余<commit>
的标签,打开的标签为空。我希望旧标签可以编辑。有办法吗
git tag <commit> <tag-name> -f -a
颠倒了<commit>和<tag-name>吗?与其他答案和文档进行比较时,它看起来是这样,但我不是专家。
我们希望使v1.x消息看起来像v2.0消息
在Git 2.17(2018年第二季度)中,将可以使用创建新标签的替代方法git tag <tag name> <tag name> -f -m "<new message>"
,因为“ git tag
”了解了一个明确的“ --edit
”选项,该选项允许进一步编辑通过“ -m
”和“ -F
” 给出的消息。
参见提交9eed6e4(2018年2月6日) Nicolas Morey-Chaisemartin(nmorey
)的)。
(由Junio C gitster
Hamano合并--在commit 05d290e,2018年3月6日)
tag
:添加--edit
选项
添加一个--edit
选项,该选项允许以相同的方式修改-m
或提供的消息。-F
git commit --edit
--edit
该OP 的连贯示例?
-f
还添加--edit
了标记,则将编辑消息并修改时间戳,对吗?
您将不得不使用-f
force标志再次进行标记。
git tag v1.0 -f -m "actual message"
使用上面的答案,这是我的别名one-liner .gitconfig
。替换现有标签并保留提交日期。
[alias]
tm = "!sh -c 'f() { export GIT_COMMITTER_DATE=$(git log -1 --format=%ci $0); git tag -f -a $0 $0^{}; }; f '"
有改善吗?
tag-amend = "!sh -c 'f() { name=$(git log -1 --format=%an $0); email=$(git log -1 --format=%ae $0); date=$(git log -1 --format=%ci $0); GIT_AUTHOR_NAME=\"${name}\" GIT_COMMITTER _NAME=\"${name}\" GIT_AUTHOR_EMAIL=\"${email}\" GIT_COMMITTER_EMAIL=\"${email}\" GIT_AUTHOR_DATE=\"${date}\" GIT_COMMITTER_DATE=\"${date}\" git tag -f -a $0 $0^{}; }; f '"
git tag -m "A message" --edit v1.0
就足够了。请参阅下面的答案