【发布时间】:2011-06-27 12:23:58
【问题描述】:
我用轻量级标签标记了一个提交,并将该标签推送到一个远程仓库,与其他开发人员共享。我现在意识到我应该对它进行注释,以便它出现在 git describe 中。
有没有办法在不破坏任何东西的情况下转换它/重新标记提交?
【问题讨论】:
我用轻量级标签标记了一个提交,并将该标签推送到一个远程仓库,与其他开发人员共享。我现在意识到我应该对它进行注释,以便它出现在 git describe 中。
有没有办法在不破坏任何东西的情况下转换它/重新标记提交?
【问题讨论】:
轻量级标签只是指向该提交的“参考”。您可以在旧标签之上强制创建一个新的注释标签:
git tag -a -f <tagname> <tagname>
从 Git v1.8.2 开始,您需要使用 --force 将远程上的任何标签替换为 git push,即使您将轻量级标签替换为有效的快进标签或真正的标签指向与现有标记引用相同的提交的对象。
git push --force origin <tagname>
【讨论】:
git tag -a -f <tagname> <tagname>^0。否则,您将创建对旧标签的新引用,而不是被盗的 refs/tags/<tagname>,将其从垃圾收集中排除。
基于Charles' answer 和this blog post,我认为最好使用这样的东西:
#!/bin/sh
tag=$1
date="$(git show $tag --format=%aD | head -1)"
GIT_COMMITTER_DATE="$date" git tag -a -f $tag $tag
【讨论】:
-s 或 --no-patch 代替 | head -1。也许使用 committer 日期 (%cD)(以及他们的名字,%cn,如GIT_COMMITER_NAME)可能是可取的。
GIT_COMMITTER_EMAIL – %ce (attn.committer 总是用双拼TT)
将所有标签转换为带注释的(基于 Charles Bailey 的示例和 Ferenc Wágner 的评论):
for tag in $(git tag -l); do git tag -a -f $tag $tag^0 -m $tag; done
git push --tags --force
【讨论】:
您也可以简单地使用git describe --tags 在搜索中也包含轻量级标签。
【讨论】: