为什么 `git describe` 显示“warning: tag 'xxx' is externally known as 'refs/tags/xxx'”?

3

我正在尝试使用git describe命令获取当前分支的最新标签名称,但是输出中出现了意外的警告。

-> git describe
warning: tag 'v0.0.6' is externally known as 'refs/tags/v0.0.6'
refs/tags/v0.0.6-0-g5392899

-> git describe --tags
warning: tag 'v0.0.6' is externally known as 'refs/tags/v0.0.6'
refs/tags/v0.0.6-0-g5392899

-> git describe --tags --abbrev=0
warning: tag 'v0.0.6' is externally known as 'refs/tags/v0.0.6'
refs/tags/v0.0.6-0-g5392899c48d700b48e0dda16129dac6a60bb3b1e

如上所述,本地标签不包含refs/tags前缀:

-> git tag -l
v0.0.1
v0.0.2
v0.0.3
v0.0.4
v0.0.5
v0.0.6

然而,我不确定为什么会收到这个警告,也不知道可以采取什么措施。

标签并没有被删除和重新创建,也没有被重命名。

这些标签是从我们的构建环境(Jenkins)创建的。

有什么方法可以纠正或解决这个警告吗?

-> git show
commit 5392899c48d700b48e0dda16129dac6a60bb3b1e (HEAD -> master, tag: v0.0.6, origin/master, origin/HEAD)
...

-> git --version
git version 2.30.1 (Apple Git-130)

编辑:

我们使用Jgit创建标签的Jenkins构建。检出分支/代码的配置如下: jenkins git checkout

使用Git Publisher 创建标签: jenkins git tag

1个回答

2

使用 git version 2.25.1,我能够重现同样的错误。唯一的区别是返回的错误信息为:

警告:此处标记 'refs/tags/1.0' 实际上是 '1.0'

这个警告来自于append_name函数,我猜测问题在于name_checked字段值为false。我尝试找出该字段背后的逻辑,但我没有成功,因为我对C语言不是很熟悉,而且至少会浪费一天时间。

你看到的这个警告可能是由其他原因引起的,但在我(手动)生成.git/packed-refs.git/refs/tags/1.0和标记对象之间的差异后,它就出现了。具体来说,我创建了一个名为refs/tags/1.0的标记,但我像这样修改了.git/packed-refs

975b54bb9b78e245f5abd1b10d6f090c4e0bbf58 refs/tags/1.0 # instead of refs/tags/refs/tags/1.0
^f84bc266f21fa641076a9bef0de4bf2ce1fa5090

然而,与您不同的是,我不仅可以通过使用“git tag -l”命令看到正确的标签,还能看到伪造的标签。
对于您的两个建议:首先,我建议检查这三个文件(“.git/packed-refs”、“.git/refs/tags/your_tag”和“ .git/objects”中的标签对象文件)是否包含任何矛盾引用。在任何情况下,请编辑您的问题,并说明Jenkins的Git插件如何克隆远程存储库。如果我没有记错,它会尽最大努力通过减少检出的引用来优化性能(也许插件中只是一个错误)。

我已详细说明了Jenkins如何执行checkout和tagging操作。我想知道问题是否出在Git Publisher上。我们在Jenkins Git发布器配置中使用refs/tags/TAG_NAME作为解决方案,用于处理使用jgit时遇到的其他问题。谢谢! - trebor
关于本地标签文件,我克隆了一个新的仓库副本,但在.git/refs/tags目录下却没有看到任何标签(即使执行了“git fetch --tags”命令)。似乎这些标签只存储在.git/packed-refs文件中。我只在.git/objects/pack目录下看到了两个文件,但不确定它们是如何使用的(文件名与提交的哈希值不同)。 - trebor
你所使用的解决方法可能是问题所在。.git/packed-refs中标签的命名方式是怎样的?我不认为压缩对象会导致这个问题,但我也不敢打赌。 - Marco Luzzara
这是.git/packed-refs文件的屏幕截图:https://i.stack.imgur.com/jJsGL.png。 - trebor
谢谢,我猜测创建的标签对象名为refs/tags/v0.0.x。如果是这样,请尝试在一个新的干净存储库中使用该git版本复制问题,标签对象名为refs/tags/v0.0.1(而不仅仅是v0.0.1),并且在packed-refs文件中具有相同的名称(就像现在一样)。如果不是这种情况,那么我们可能遗漏了某些东西。 - Marco Luzzara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接