如果提交有两个标签,git describe --match 返回错误的标签名称

Posted

技术标签:

【中文标题】如果提交有两个标签,git describe --match 返回错误的标签名称【英文标题】:git describe --match returns wrong tag name if commit has two tags 【发布时间】:2021-09-24 03:03:58 【问题描述】:

我正在尝试为提交添加一个额外的标签,以便以后能够通过git describe 使用--match 模式选择此提交;

当我使用--match 用一个标签捕获通常的提交时,一切正常。

但是当我尝试通过模式“部署”将提交与两个标签匹配时,我得到了非常奇怪的标签,例如:

我已提交:b946bdf (tag: a@0.0.1) Publish

我添加“已部署”标签:b946bdf (tag: a@0.0.1, tag: deployed) Publish

然后我运行git describe --abbrev=0 --match "deployed"

而这条命令的结果是a@0.0.1-9-g1e5c94cc55fded72114b801bd47d8d29e7721255

如果我尝试使用--abbrev=1,我会得到a@0.0.1-9-g1e5c9

最有趣的是-9-g1e5c94cc55fded72114b801bd47d8d29e7721255 甚至不是这个提交的一个。我不知道为什么以及从哪里得到这个奇怪的标识符。

我想要一个干净的标签,比如a@0.0.1

我做错了什么?

【问题讨论】:

你的 git 版本是什么?你能更新到最新的“2.32”版本吗? 【参考方案1】:

git describe--match 选项采用 shell 样式的全局模式,例如 a*z。然后它通过 shell 样式的匹配器运行git tags 列出的标签。1 因此,给定 glob 模式 a*z,名为 abuzzaveloz 的标签将匹配,但标签命名为arbiterfuzz 不会。

您的 glob 模式是 deployed,并且由于不允许使用通配符,因此 --match 选项唯一的 允许 标记是 deployed 本身。你确实有一个名为deployed的标签,而你只给了一个--match,所以这是唯一允许的。

如果我创建这样一个标签,我可以使用它:

$ git tag -a deployed -m silly
$ git describe --abbrev=0 --match deployed
deployed

这个标签当然不能用于任何早期的版本:

$ git describe --abbrev=0 --match deployed HEAD~
fatal: No tags can describe '98f3f03bcbf4e0eda498f0a0c01d9bd90de9e106'.
Try --always, or create some tags.

删除标签会产生相应的错误:

$ git tag -d deployed
Deleted tag 'deployed' (was a464a376ca)
$ git describe --abbrev=0 --match deployed 
fatal: No names found, cannot describe anything.

我无法解释你的输出。 git describe 中出现过bug; the release notes for Git 2.15.0 point one out,例如。但这不会产生您显示的输出(我认为)。你用的是什么版本的 Git?


1这实际上全部内置于git describe 本身,它不必运行git tags。不过效果是一样的。请注意,shell glob 模式可能需要引用以保护它们免受 shell 的影响,具体取决于您的 shell。

【讨论】:

【参考方案2】:

如果您的意图是获取由deployed 标记的提交的哈希,只需使用git rev-parse

# works for any type of tag :
git rev-parse deployed^

# works if 'deployed' is a plain tag :
git rev-parse deployed

如果deployed 是一个带注释的标签,git rev-parse deployed(没有^)会给你标签对象本身的哈希,而不是被标记的提交的哈希。


这并不能解释你从 git describe 得到的奇怪输出,但我认为值得一提这个命令。

【讨论】:

以上是关于如果提交有两个标签,git describe --match 返回错误的标签名称的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Git 的 `describe` 命令派生应用程序构建版本字符串?

`git describe` 与 gitlab python API

Android 发布自动版本号方案 ( gradle + git )/ git rev-list HEAD/git describe --tags

如何判断一个标签在 Git 中指向哪个提交?

Git 标签

08Git标签