轻量级标签能否转换为注释标签?

51

我已经为一个提交打上了轻量级标签,并将该标签推送到与其他开发人员共享的远程仓库。现在我意识到我应该注释它,以便在 git describe 中出现。

有没有一种方法可以在不破坏东西的情况下转换它或重新标记该提交?

4个回答

41

轻量级标签只是指向该提交的'ref'。您可以在旧标签之上强制创建一个新的注释标签:

git tag -a -f <tagname> <tagname>

从Git v1.8.2开始,即使您要用新的轻量级标签替换现有标签引用并且这个新标签在指向与原标签相同的提交时是可以快进的或是真正的标签对象,您也需要使用--force选项才能用git push将其推送到远程。

git push --force origin <tagname>

5
这会不会使用一个令人困惑的日期? - SamB
3
另外,对于已经拉取了原轻量级标签的开发人员是否有任何影响?这些开发人员在再次拉取后能否看到新标签的注释,还是需要做一些特殊的事情(比如删除他们本地的标签)? - sschuberth
1
@ZacThompson:这个变化发生在v1.8.2版本(2013年3月)。 - CB Bailey
4
如果您不想使用标签标记标签,请改用 git tag -a -f <tagname> <tagname>^0 命令。否则,您将创建对旧标签的新引用,而非被删除的 refs/tags/<tagname>,这将导致其无法进行垃圾回收。 - Ferenc Wágner
6
警告:如果您在 GitHub 存储库上进行此操作,并且您要替换的轻量级标签与发布相关联,则删除该标签将悄悄地删除与该标签相关联的整个发布(以及发布说明)。如此处所述,无法恢复意外删除的发布。 - Edward
显示剩余7条评论

25

根据Charles的答案以及这篇博客文章,我认为最好使用类似于以下内容的方法:

#!/bin/sh
tag=$1
date="$(git show $tag --format=%aD | head -1)"
GIT_COMMITTER_DATE="$date" git tag -a -f $tag $tag

3
不错 :) 你可以使用 -s--no-patch 替代 | head -1。也许使用提交者日期 (%cD) (以及他们的姓名, %cn,作为 GIT_COMMITTER_NAME) 更为理想。 - Tobias Kienzler
并且邮件地址!GIT_COMMITTER_EMAIL - %ce(注:committer 总是拼写为双 T - Kay
1
@TobiasKienzler 嗯,我认为除非我有理由相信他们确实标记了它,否则我不会使用他们的名称。然而,使用提交者日期而不是作者日期确实有意义,因为标签不能在提交之前进行,提交者日期通常不会早于作者日期... - SamB
@SamB 啊,没错,我当然是假设提交者打了标签,现在(抱歉 :))你提到它,很可能仅从轻量级标签中无法确定,这是个好观点。 - Tobias Kienzler

6

将所有标签转换为注释(基于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

3
你可以简单地使用git describe --tags来搜索时包括轻量级标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接