我们的git存储库中有几个带注释的标签.较旧的标签有伪造的消息,我们想要更新为我们的新风格.
% git tag -n1
v1.0 message
v1.1 message
v1.2 message
v2.0 Version 2.0 built on 15 October 2011.
Run Code Online (Sandbox Code Playgroud)
在此示例中,我们希望使v1.x消息看起来像v2.0消息.有谁知道我们会怎么做?
And*_*ndy 239
git tag <tag name> <tag name>^{} -f -m "<new message>"
这将创建一个具有相同名称的新标记(通过覆盖原始标记).
Eri*_* Hu 82
要更新复杂消息,只需使用带-a符号标记选项或带签名标记选项-s:
git tag <tag name> <tag name>^{} -f -a
Run Code Online (Sandbox Code Playgroud)
这将打开一个包含旧标记消息内容的编辑器.
Sun*_*gam 37
git tag <tag name> <tag name>^{} -f -a
这是对Andy和Eric Hu的回答的改进.他们的答案将创建一个引用旧标记对象的新标记对象,其中两个标记对象将具有相同的标记名称.
<tag name>^{} 将解析标记/引用,直到找到第一个提交哈希.
sta*_*anm 31
您可以通过删除标记并在欺骗日期和作者的同时重新创建它来执行此操作:
> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]
Run Code Online (Sandbox Code Playgroud)
以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]
Run Code Online (Sandbox Code Playgroud)
使用将<tag name>^{}作为git tagwill 的第二个参数,而不是删除所有以前具有相同名称的标记.
考虑前一个终端会话的继续:
> 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]
Run Code Online (Sandbox Code Playgroud)
最后,如果您想将原始标记的日期保留为更新标记的日期,请使用一些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]
Run Code Online (Sandbox Code Playgroud)
参考文献:
或者更新标签,您可以删除它们并再次创建它们.事实证明,更新只会添加一个新标记并使其指向旧标记,或者只是隐式删除旧标记并创建一个新标记以指向同一个提交.
你可以通过发布:
> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]
Run Code Online (Sandbox Code Playgroud)
这[optional]是一个可选字段; <required>是必填字段.当然,您可以在git tag通常的命令之后添加任何标志.
liu*_*ng1 10
@Andy的解决方案
git tag <tag-name> <tag-name> -f -a
Run Code Online (Sandbox Code Playgroud)
是错的.在它之后,用
git show
Run Code Online (Sandbox Code Playgroud)
命令,我们将看到具有相同名称的堆栈标记.
它在commit时添加一个具有相同标记名称和新消息的新标记<tag-name>.但它不会删除旧标签.这是该命令的一个特例:
git tag [<commit> | <old-tag>] <tag-name>
Run Code Online (Sandbox Code Playgroud)
但<old-tag>就是一样<tag-name>.
正确的解决方案很简单,只需更新标签即可.
git tag <tag-name> -f -a
Run Code Online (Sandbox Code Playgroud)
记住, 这里只有一个.
如果我们想要改变标签,那么HEAD我们需要一个额外的<commit>参数.
git tag <commit> <tag-name> -f -a
Run Code Online (Sandbox Code Playgroud)
您必须使用-f强制标志再次标记。
git tag v1.0 -f -m "actual message"
Run Code Online (Sandbox Code Playgroud)
我们希望使v1.x消息看起来像v2.0消息
在Git 2.17(2018年第2季度)中,将可以使用创建新标签的替代方法git tag <tag name> <tag name> -f -m "<new message>",因为“ git tag”了解了明确的“ --edit”选项,可以进一步编辑通过“ -m”和“ -F” 给出的消息。
参见Nicolas Morey-Chaisemartin()的commit 9eed6e4(2018年2月6日)。(通过合并JUNIOÇ滨野- -在提交05d290e,2018年3月6日)nmorey
gitster
tag:添加--edit选项
添加一个--edit选项,该选项允许以相同的方式修改-m或提供的消息。-Fgit commit --edit
使用上面的答案(尤其是Sungam 的),这是我的别名 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 '"
Run Code Online (Sandbox Code Playgroud)
改进?
| 归档时间: |
|
| 查看次数: |
63826 次 |
| 最近记录: |