如果提交有两个标签,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
,名为 abuzz
和 aveloz
的标签将匹配,但标签命名为arbiter
或fuzz
不会。
您的 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