【问题标题】:"git describe" ignores a tag“git describe”忽略标签
【发布时间】:2010-11-11 12:44:12
【问题描述】:

在以下几行中:

$ 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标签已经推送了,估计是删不掉再重新添加吧。

【问题讨论】:

标签: git git-tag git-describe


【解决方案1】:

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

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

【讨论】:

  • "git describe --tags" 产生与上面相同的输出。
  • 您也可以尝试--all 使其使用所有参考。 HEAD 是由标签描述的吗? (只是为了确保)
  • "git describe --all" 打印“heads/master”。 v2.0 标签应用于 master 分支。 (我想这意味着它描述了 HEAD?)
  • HEAD 是当前签出的提交。
  • 确保你已经签出了正确的提交 (git rev-parse HEAD)——同时确保你使用的是最新版本的 git。带注释的标签是用git tag -a 创建的。如果您执行git show <tagname> 并看到提交,则它是一个轻量级标签,如果您看到标签消息,则它是一个带注释的标签。
【解决方案2】:

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

# 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

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

另一种可能发生这种情况的情况是,如果您在分支中有一个更“接近”您的标签。该案例已在this blog post 中进行了解释。

【讨论】:

  • 我遇到了类似的问题,所以我认为最好的方法是防止创建重复的注释标签。你知道我是怎么做到的吗?
  • @jbucaran 我猜你需要运行检查,然后根据它标记或不标记。这可能是另一个问题的主题
【解决方案3】:

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

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

 $ 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

因此,就我而言,开发人员决定创建一个新的 release 分支,专门用于标记版本,这导致开发分支不再与标签保持同步。

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

【讨论】:

    【解决方案4】:

    从您的示例中最有可能的是,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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-19
      • 2018-03-13
      • 2014-10-07
      • 1970-01-01
      • 2010-11-02
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多