Get last git tag from a remote repo without cloning
如何从(非签出)远程仓库中获取最后一个标签?
在我的本地副本上,我使用
1 | git describe --abbrev=0 --tags |
但是我不能将
使用
例如,如果我们想知道Git最新的标签是什么,我们会做什么
1 | git ls-remote --tags git://github.com/git/git.git |
返回一个包含所有标记的长列表,按字母顺序排列,如下所示(为了理智而截断)。
最后一行告诉我们最新的标签是
请记住,标签可以是任何类型的字符串,正如Christopher Gervais在其答案中指出的那样,
更新版本的
因此,为了自然地对它们进行排序,您的命令将如下所示:
1 | git ls-remote --tags git://github.com/git/git.git | sort -t '/' -k 3 -V |
如果您需要更多/其他
1 2 3 4 5 6 7 8 9 10 11 12 | ... e4dc716b1cfefb0e1bd46c699d4f74009118d001 refs/tags/v1.7.9 828ea97de486c1693d6e4f2c7347acb50235a85d refs/tags/v1.7.9^{} cc34c0417dfd4e647e41f3d34a032b7164aadea7 refs/tags/v1.7.9-rc0 eac2d83247ea0a265d923518c26873bb12c33778 refs/tags/v1.7.9-rc0^{} ad2ec9a47a031ebf056444a94bea3750aaa68f63 refs/tags/v1.7.9-rc1 6db5c6e43dccb380ca6e9947777985eb11248c31 refs/tags/v1.7.9-rc1^{} eab05abaeb51531e11835aaa4c26564a1babebac refs/tags/v1.7.9-rc2 bddcefc6380bd6629f3f12b5ffd856ec436c6abd refs/tags/v1.7.9-rc2^{} ... 5ace0b7af106b44687005085d8c252f8be9da5d3 refs/tags/v1.8.0-rc0 b0ec16b49eb283156e13bbef26466d948e4fd992 refs/tags/v1.8.0-rc0^{} |
不幸的是,
1 2 3 4 5 6 7 | git ls-remote --tags git://github.com/git/git.git |grep"1\.7\." [...] bf68fe0313c833fa62755176f6e24988ef7cf80f refs/tags/v1.7.9.6 cb2ed324fc917db0b79d7b1f3756575ffa5f70d5 refs/tags/v1.7.9.6^{} 3996bb24c84013ec9ce9fa0980ce61f9ef97be4d refs/tags/v1.7.9.7 d0f1ea6003d97e63110fa7d50bb07f546a909b6e refs/tags/v1.7.9.7^{} |
但是,我们可以通过'sort'来管理这些结果,以便更接近我们正在寻找的结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | git ls-remote --tags git://github.com/git/git.git |grep"1\.7\."| sort -g -k3 -t. [...] eab05abaeb51531e11835aaa4c26564a1babebac refs/tags/v1.7.9-rc2 eac2d83247ea0a265d923518c26873bb12c33778 refs/tags/v1.7.9-rc0^{} f59f511e26b4924b22c6966e79fe4f754bc81dc6 refs/tags/v1.7.9.2 0e2d57fd50f61e668be3180bc8f25991ea88aa8c refs/tags/v1.7.10-rc1^{} 121f71f0da1bc9a4e1e96be2c3e683191a82a354 refs/tags/v1.7.10.4^{} 26e5c5d09334d157bd04f794f16f6e338d50c752 refs/tags/v1.7.10.3^{} [...] cffb45719f60d6fc2cc98ead6af88a895c63c9ac refs/tags/v1.7.12.4 d8cf053dacb4f78920c112d10c7be21e4f5a5817 refs/tags/v1.7.12.2^{} dcd07fb6262fd8bb9f531890df3986a8b719a0b5 refs/tags/v1.7.12-rc0 e15c16de396a1e1f42001b03cb885ce64eb4098e refs/tags/v1.7.12-rc2^{} |
虽然仍然不正确,但它更接近。如果我们排除-rc和^ {},并在最后一个子版本号上添加一个额外的排序,我们可能已经足够接近满足大多数需求:
1 2 3 4 5 6 7 8 9 | git ls-remote --tags git://github.com/git/git.git |grep"1\.7\."|grep -v -|grep -v {| sort -n -t. -k3 -k4 23ed9debf17263ed6bed478a4d6d86e71342c18a refs/tags/v1.7.11.6 527b331100ddba839cc54bb31c1bcd66acc08321 refs/tags/v1.7.11.7 14d20a75e3d57a872a8c81ae90dcc4c61ddba011 refs/tags/v1.7.12 51993a414a76120fda20d56ba767fa513d9ff440 refs/tags/v1.7.12.1 04043f4d1ae42bddee67d354a2e6fd2464592a1e refs/tags/v1.7.12.2 b38da673be332933b8f3a873ce46ffea08d2ee2c refs/tags/v1.7.12.3 cffb45719f60d6fc2cc98ead6af88a895c63c9ac refs/tags/v1.7.12.4 |
从Git 2.18开始,你实际上可以使用
1 | git ls-remote --tags --sort="v:refname" git://github.com/git/git.git | tail -n1 |
要删除散列和解除引用标记(
1 2 3 | git ls-remote --tags --sort="v:refname" git://github.com/git/git.git | tail -n1 | sed 's/.*\///; s/\^{}//' # outputs something like: v2.18.0 |
这对我来说如何从github远程存储库获取最新标记
1 | git ls-remote --tags"#{github_repo}" | awk '{print $2}' | grep -v '{}' | awk -F"/" '{print $3}' | sort -n -t. -k1,1 -k2,2 -k3,3 | tail -n 1.chomp |
这是我的单行:-)
1 | git ls-remote --tags git://github.com/git/git.git | cut -d/ -f3- | sort -t. -nk1,2 -k3 | awk '/^[^{]*$/{version=$1}END{print version}' |
TL; DR:
1 2 3 4 | % git -c 'versionsort.suffix=-' ls-remote -t --exit-code --refs --sort=-v:refname \ https://github.com/robert7/nixnote2 'v*' \ | sed -En '1!q;s/^[[:xdigit:]]+[[:space:]]+refs\/tags\/(.+)/\1/gp' v2.1.0-beta4g |
说明
将
1 | $ git ls-remote -t --refs <URL> |
这给出了如下输出:
1 2 3 4 | 8f235769a2853c415f811b19cd5effc47cc89433 refs/tags/continuous 24e666ed73486a2ac65f09a1479e91e6ae4a1bbe refs/tags/continuous-develop 7c2cff2c26c1c2ad4b4023a975cd2365751ec97d refs/tags/v2.0 35b69eed46e5b163927c78497983355ff6a5dc6b refs/tags/v2.0-beta10 |
要仅获取标记名称,请通过:
1 2 3 4 5 6 | $ git ls-remote -t --exit-code --refs https://github.com/robert7/nixnote2.git \ | sed -E 's/^[[:xdigit:]]+[[:space:]]+refs\/tags\/(.+)/\1/g' continuous continuous-develop v2.0 v2.0-beta10 |
然后,您可以通过适当的
建议:
-
在命令行的末尾添加一个模式以进行过滤。例如
'v*' ,如果所有版本标签都以v 开头。 -
传递
--exit-code 以确保在未返回匹配的引用时退出非0 。 -
使用
https:// 版本:它更快,如果您打包,您不希望冒被要求输入ssh密钥的风险。 -
--sort=-v:refname 按版本而不是按字母顺序排序,并且在顶部具有最大版本 -
使用
git -c versionsort.suffix=- 阻止2.0-rc 在"2.0 之后"