80

在以下几行中:

$ git tag -n1
v1.8        Tagged the day before yesterday
v1.9        Tagged yesterday
v2.0        Tagged today
$ git describe
v1.9-500-ga6a8c67
$ 

谁能解释为什么“git describe”不使用v2.0标签,以及如何解决这个问题?v2.0标签已经推送了,所以我猜我不能只是删除并重新添加它。

4

4 回答 4

103

git describe默认情况下仅使用带注释的标签。指定--tags选项以使其也使用轻量级标签。

确保您已签出正确的提交 ( git rev-parse HEAD)。带注释的标签是用git tag -a. 如果您这样做git show <tagname>并且只看到提交,那么它是一个轻量级标签;如果您看到额外的标签消息,则它是一个带注释的标签。

于 2010-11-11T12:48:28.963 回答
26

当这种情况发生在我们身上时,是两个标签应用于同一个提交的情况。您可以通过运行找到是否是这种情况

# git log --oneline --decorate=short
deba4b4 (tag: v1.1.0.20.0, tag: v1.1.0.19.0) 001 New buildnumber

这里有两个标签,一个用于版本 19,另一个用于 20。20 在 19 之后被标记,但用于相同的提交。在这种情况下描述返回

# git describe --tags
v1.1.0.19.0

我不知道它为什么这样做,但这就是它似乎与重复标签一起工作的方式。

另一种可能发生这种情况的情况是,如果您在分支中有一个离您更“近”的标签。该案例已在此博客文章中进行了解释。

于 2012-01-11T10:53:29.760 回答
24

问题是git tag显示所有分支中的所有标签,而仅使用当前分支git describe中可用的提交标签。

这是一个例子(我实际上来这里的原因):

 $ git tag | tail -n3
v0.4.0
v0.4.1
v0.4.2

它显示可用的最新标签是v0.4.2,但这是我的输出git describe

 $ git describe --tags
v0.4.0-2-acd334c

我在开发分支上。当我深入研究日志时,我确实看到当前分支上没有最新的标签:

 $ git log --oneline --decorate=short | grep 'tag\:' | head -n3
acd334c (tag: v0.4.0) Merge pull request #1061
988fe5e (tag: v0.3.6) Merge pull request #859
5f97274 (tag: v0.3.5) Merge pull request #646

所以在我的例子中,开发人员决定创建一个新的发布分支,专门用于标记发布,这导致开发分支不再与标签保持同步。

希望对您有所帮助并感谢@eis 检查日志的想法。

于 2016-09-21T08:59:36.587 回答
2

最有可能来自您的示例,v1.9是来自合并提交的标签。

默认情况下,这是预期的 git 行为,您可以在此处阅读更多信息: https ://git.kernel.org/pub/scm/git/git.git/commit/?id=80dbae03

要在当前分支上查找最新的时忽略合并标签,您可以使用--first-parent选项。

git describe --tags --first-parent --abbrev=0

--第一父母

在看到合并提交时,仅关注第一个父提交。当您希望不匹配目标提交历史中合并的分支上的标签时,这很有用。

参考:https ://git-scm.com/docs/git-describe

于 2020-02-06T18:40:12.457 回答