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

问题描述

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

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

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

我已提交: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

我做错了什么?

解决方法

[K in keyof T]: T[K] extends Thing ? ... : ...--match 选项采用 shell 样式的 glob 模式,例如 git describe。然后它通过 shell 样式的匹配器运行 a*z 列出的标签。1 因此,给定全局模式 git tags,标签名为 a*z 和 {{1 }} 会匹配,但名为 abuzzaveloz 的标签不会。

您的 glob 模式是 arbiter,并且由于不允许使用通配符,因此此 fuzz 选项唯一的 允许 标记是 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. 中存在错误; the release notes for Git 2.15.0 point one out,例如。但这不会产生您显示的输出(我认为)。您使用的是哪个版本的 Git?


1这实际上都内置于 $ git tag -d deployed Deleted tag 'deployed' (was a464a376ca) $ git describe --abbrev=0 --match deployed fatal: No names found,cannot describe anything. 本身,它不必运行 git describe。不过效果是一样的。请注意,根据您的 shell,shell glob 模式可能需要引用以保护它们免受 shell 的影响。

,

如果您的目的是获取由 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 得到的奇怪输出,但我认为值得一提的是这个命令。