git在同一个提交中描述了两个标签

Bil*_*oor 12 git

我们偶尔会在同一次提交中有两个标记.当我们为该提交使用git describe时,git describe总是返回第一个标记.我对git-describe手册页的阅读似乎表明应该返回第二个标签(这更有意义).

  SEARCH STRATEGY
     For each committish supplied, git describe will first look for a tag which tags
     exactly that commit. Annotated tags will always be preferred over lightweight tags, 
     and tags with newer dates will always be preferred over tags with older dates. 
     If an exact match is found, its name will be output and searching will stop.
Run Code Online (Sandbox Code Playgroud)

有没有办法git describe返回第二个标签?

Adr*_*ish 5

您是否尝试过 git describe 的任何选项?

   --all
       Instead of using only the annotated tags, use any ref found in .git/refs/. This option enables
       matching any known branch, remote-tracking branch, or lightweight tag.

   --tags
       Instead of using only the annotated tags, use any tag found in .git/refs/tags. This option
       enables matching a lightweight (non-annotated) tag.
Run Code Online (Sandbox Code Playgroud)

  • [在 v1.7.1.1 中修复](http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.7.1.1.txt) - 标签日期也被检查抢七。 (7认同)
  • 轻量级标签没有自己的日期信息,因此当它们在同一提交中时不能按日期排序。 (5认同)
  • 不幸的是,我们已经使用了这些选项。我想知道这是一个错误吗? (4认同)

jgm*_*jgm 5

Git 在这种情况下的行为是奇怪且令人困惑的。

当我为同一个提交创建两个标签时,我注意到.git/refs/tags每个标签都有自己的提交,因此理论上可以以明确的方式签出确切的标签。

但实际上并非如此。

可以说我已经提交了 ABCD。我给它做了两个标签(带注释),v1.0 和 v2.0。

然后我有这样的事情..

master -> ABCD hotfix -> ABCD v1.0 (3423) -> ABCD v1.0 (4234) -> ABCD

当我签出 master 或 hotfix 等分支时,我注意到 git 只是存储在.git/HEAD分支的引用中,所以一切都很好,它不是含糊的,而是一个特定的分支。

当我直接检查提交时,它本质上是不明确的。HEAD 将仅包含提交的哈希值ABCD

当您签出 v1.0 或 v2.0 等标签时,HEAD 将不包含标签引用或标签提交,而是包含提交 id,就像您直接签出提交一样!

令人困惑的是,如果您签出一个分支(例如 master),然后签出一个标签,git status 和描述将显示正确的标签,即您签出的标签,即使它是不明确的!

但是,如果您随后签出指向同一标签的另一个标签,它将显示原始标签。从分支切换到标签会记住标签,从标签切换到标签则不会。

我不知道这是否是一个错误,也不知道 git 是如何做到这一点的(我猜它会重复(.git/logs/HEAD),但考虑到这种行为似乎是任意的,我会冒险猜测,如果你只是想使用命令来获取用户从上到下选择的内容,无论是标签、分支还是提交,那么我认为这不会得到可靠的支持。

如果您尝试使用命令自动获取版本,那么您将需要让用户手动输入标签或采取一些程序来消除冲突。

轻量级标签(没有注释,本身没有提交,只是直接指向提交的指针)以同样奇怪的方式表现。鉴于它能够准确地保留用户在一种情况下签出的位置,但在另一种情况下失败,我建议这是一个错误,应该报告。

其用例是用户仅检查一件事物,即使该标识符可能指向具有许多其他标识符的事物。为了方便起见,您希望获取用户输入的标识符以用作构建的标识符。Git 记住该标识符的能力莫名其妙地不一致。

在这种情况下,您的脚本将需要尝试派生一个最佳标识符,但如果标识符不明确,则会产生错误。您不能依赖 git status 或描述之类的东西,因为有时它们不会生成从标签切换到标签而不是分支到标签时所看到的最后签出的内容。

可以看出,其中.git/logs/HEAD似乎包含分支到标记报告,但一旦您位于标记上,则不会记录任何内容。

描述似乎总是返回最新的带注释(非轻量级)标签。如果您混合标记类型,则不应假设行为一致。轻量级标签似乎也使用最新版本(大概基于文件的时间戳而不是提交时间),但如果没有--all或 则不会被搜索--tags。即使使用 --all,带注释的标签似乎也优先于更新的轻量级标签。

获取我能找到的当前标签的所有标识符的唯一便捷方法是运行 git show-ref 并取消引用并 grep 查找当前提交。这不包括用于排序的时间戳。


ssg*_*gao 5

两种方法,看你的需要。

方法一

git tag -l | sort -V | tail -1
Run Code Online (Sandbox Code Playgroud)

如果您想检查特定格式,例如语义版本

git tag -l | grep "v[0-9]*.[0-9]*.[0-9]*$" | sort -V | tail -1
Run Code Online (Sandbox Code Playgroud)

方法二

git tag --sort=committerdate | tail -1
Run Code Online (Sandbox Code Playgroud)

如果您想检查特定格式,例如语义版本

git tag --sort=committerdate | grep "v[0-9]*.[0-9]*.[0-9]*$" | tail -1
Run Code Online (Sandbox Code Playgroud)


qne*_*ill 1

据我所知,“gitdescribe”无法消除轻量级标签的歧义,因此会打印它遇到的第一个标签。此代码片段假设标签遵循可通过“sort -R”排序的模式,并将返回给定 SHA 上的“最新”标签:

git tag --contains SHA | sort -R | tail -1
Run Code Online (Sandbox Code Playgroud)