"git describe"忽略一个标签。

86
在以下代码行中:
$ 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标签,所以我猜不能只是删除并重新添加它。


1
另请参见https://dev59.com/jZHea4cB1Zd3GeqPn1Uo - caw
我只是执行了 git merge master 命令,之后一切都像魔法般地正常工作了! - kato2
对我来说,问题出在一个压缩的提交上。即使提交被压缩了,标签仍然存在。 - mihaa123
4个回答

116

git describe 默认仅使用带注释的标签。指定--tags选项可使其同时使用轻量级标签。

确保您已检出正确的提交(git rev-parse HEAD)。使用git tag -a创建带注释的标签。如果您运行git show <tagname>,并且只看到了提交信息,则该标签是轻量级标签;如果您看到了其他标签消息,则是带注释的标签。


13
"git describe --tags" 命令会产生与上述相同的输出。 - knipknap
你也可以尝试使用 --all 命令来使用所有引用。HEAD 是否被标签所描述?(只是为了确认) - knittl
"git describe --all" 命令会输出 "heads/master"。v2.0 标签被应用在 master 分支上。(我猜这意味着它描述了 HEAD?) - knipknap
啊,是的,HEAD 目前已经签出。我怎么知道一个标签是否被注释了呢?“git tag” 似乎没有显示这个选项。 - knipknap
1
确保您已经检出了正确的提交(git rev-parse HEAD)-还要确保您使用最新版本的git。注释标签是使用git tag -a创建的。如果您执行git show <tagname>并且看到提交,则为轻量级标签;如果您看到标签消息,则为注释标签。 - knittl
显示剩余2条评论

31

我们遇到这种情况时,是由于对同一提交应用了两个标签。您可以通过运行以下命令来查找是否存在此情况:

# 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

我不知道为什么会这样,但这似乎是与重复标签一起使用的方式。

另一种可能出现这种情况的情况是,如果您在分支中有一个标签更加“接近”您的标签。该情况已在此博客文章中解释过。


1
我遇到了类似的问题,所以我想最好的方法是防止创建重复的注释标签。你知道我怎么能做到吗? - Jorge Bucaran
@jbucaran 我猜你需要运行一个检查,然后根据检查结果打标签或不打标签。这可能是另一个问题的主题。 - eis

26

问题在于 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

我正在develop分支上。当我查看日志时,我确实发现最近的标签在当前分支上不可用:

 $ 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提供通过检查日志来解决问题的想法。


3
根据你提供的例子,v1.9 很可能是从合并提交中获取的标签。
这是 git 的默认行为,你可以在这里了解更多信息: https://git.kernel.org/pub/scm/git/git.git/commit/?id=80dbae03 如果要忽略查找当前分支上最新的合并标签,可以使用 --first-parent 选项。
git describe --tags --first-parent --abbrev=0

--first-parent

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

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


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