`ls-remote --refs` 与克隆然后`describe --tags` 有什么关系?

How do `ls-remote --refs` vs. cloning then `describe --tags` relate?

列出远程存储库的最新标签与克隆该存储库然后描述其标签产生不同的答案。例如

$ ​git ls-remote --refs git://git.kernel.org/pub/scm/git/git.git | tail -1
dcba104ffdcf2f27bc5058d8321e7a6c2fe8f27e    refs/tags/v2.9.5
$ git clone -q git://git.kernel.org/pub/scm/git/git.git gitdir && cd gitdir && git describe --tags
v2.31.1-606-gdf6c4f7

这两种价值观如何相互关联?它们有什么不同?

我了解到“在调用 describe 之前 " and my question may relate to that, but I think I don't understand that phrase's implications. I did try another suggestiongit fetch --tags,无济于事。

我最终想做的是以编程方式找到最稳定的版本或标签(如果他们不使用版本),并检查该版本以在本地构建它。

TL;DR

我相信您想要的是 git describe --tags.

输出的第一个标记

详情

这两个命令有不同的用途。

git ls-remote 列出远程存储库上的引用,但不对它们的列出顺序做出任何承诺。当然,最近的通常是最后一个,但它不一定是最相关的,特别是如果该标签位于尚未合并的分支上。

另一方面,

git describe 试图就从那里可到达的最新标签向您提供 HEAD(默认情况下,或您指定的提交)的简明描述.如果您仅将标签用于稳定提交,那么这可能就是您想要的标签。然后,一旦找到该标记,它就会告诉您 HEAD 中还有多少提交,在您的示例中有 606 个,然后是“g”(不确定为什么),然后是 HEAD 的 sha1。这意味着对任何提交的人类可读描述,如“哦,你在 v2.31.1 之前有 606 次提交”,但也是一个明确的描述,因为你得到了 sha1.

至于将 --tags 选项添加到 git describe,如果您的标签没有注释,则需要它,例如,如果某些标签是使用 git tag <tagname> <commit> 而不是 [=20= 创建的].后者更可取,因为它允许标记器描述标记的内容,但您不能总是指望每个人都使用它。所以将 --tags 添加到 git describe.

可能是个好主意

如果你的 repo 只包含稳定版本的标签,并且这些版本不在​​不同的版本分支上,并且你的标签名称中从来没有连字符,那么这将是最新的稳定版本,它是 HEAD:

git describe --tags | sed 's/-.*//'

这些参考文献似乎是按字母顺序排序的,而不是按数值排序的,所以 tail -1 returns 不是最新的标签,而是按字母排序的最后一个。查看 git ls-remote 的全部输出;这是相关部分:

a320a5c4764b02f0898a98b4b58e11fad5e54e09        refs/tags/v2.3.9
2d9685d47a7e516281aa093bf0cddc8aafa72448        refs/tags/v2.30.0
a8eaf9de52c2d49799d7dc724e688ccbfa74390c        refs/tags/v2.30.0-rc0
cb70effebd91d9e0d4ce81650785e973b5d16ad1        refs/tags/v2.30.0-rc1
a6fee3f22b95c86086b11e3c93d0f1752f9a75c5        refs/tags/v2.30.0-rc2
36b80a59b799802fe776ed390870fe520d262f5c        refs/tags/v2.30.1
4340cdd2bdf420acc349f5cda141141230d5095a        refs/tags/v2.30.2
3e90d4b58f3819cfd58ac61cb8668e83d3ea0563        refs/tags/v2.31.0
4c4ac06896d8b9ec1ded1d5d9aeedb4e8ece44ab        refs/tags/v2.31.0-rc0
6a80b8083c4be2c5703ec122e511a6747af53295        refs/tags/v2.31.0-rc1
ca1f84a036c5658938d72650ae34630ebb140866        refs/tags/v2.31.0-rc2
28afb7555c7013c02b5ee5dc0286546f1f8e2b8f        refs/tags/v2.31.1
67308bd628c6235dbc1bad60c9ad1f2d27d576cc        refs/tags/v2.4.0
92db05f2a784fe0a715de29fc97172eac6bb5089        refs/tags/v2.4.0-rc0
1c8737f27f912aa2438ce3bf9d4e83eb178de00a        refs/tags/v2.4.0-rc1
48e512c8c9397baa5533efa6683f45646234ae1e        refs/tags/v2.4.0-rc2
4beece6ef56cb59ea05afb326fd17c1839b8f282        refs/tags/v2.4.0-rc3
2be062dfcfd1fd4aca132ec02a40b56f63776202        refs/tags/v2.4.1
dd0e3e9610a9b312236fb926c5a9d8cbd73190d9        refs/tags/v2.4.10
4f24175ae76efaf8265e179662a4258387019256        refs/tags/v2.4.11
0a493fee385e530baa898a4ba4c0a64fd02ed0d6        refs/tags/v2.4.12
29932f3915935d773dc8d52c292cadd81c81071d        refs/tags/v2.4.2

要按数值排序,请使用 --sort=v:refname:

$ git ls-remote --sort=v:refname --refs git://git.kernel.org/pub/scm/git/git.gitt | tail -10
a8eaf9de52c2d49799d7dc724e688ccbfa74390c        refs/tags/v2.30.0-rc0
cb70effebd91d9e0d4ce81650785e973b5d16ad1        refs/tags/v2.30.0-rc1
a6fee3f22b95c86086b11e3c93d0f1752f9a75c5        refs/tags/v2.30.0-rc2
36b80a59b799802fe776ed390870fe520d262f5c        refs/tags/v2.30.1
4340cdd2bdf420acc349f5cda141141230d5095a        refs/tags/v2.30.2
3e90d4b58f3819cfd58ac61cb8668e83d3ea0563        refs/tags/v2.31.0
4c4ac06896d8b9ec1ded1d5d9aeedb4e8ece44ab        refs/tags/v2.31.0-rc0
6a80b8083c4be2c5703ec122e511a6747af53295        refs/tags/v2.31.0-rc1
ca1f84a036c5658938d72650ae34630ebb140866        refs/tags/v2.31.0-rc2
28afb7555c7013c02b5ee5dc0286546f1f8e2b8f        refs/tags/v2.31.1