gpt4 book ai didi

git - 从远程仓库获取最后一个 git 标签,无需克隆

转载 作者:IT王子 更新时间:2023-10-29 00:46:46 26 4
gpt4 key购买 nike

如何从(未 checkout 的)远程仓库获取最后一个标签?

在我的本地副本上,我使用 describe

git describe --abbrev=0 --tags

但我不能使用 describe带远程存储

最佳答案

TL; 博士
git ls-remote 您可以从远程存储库获取引用列表。
要查看最新版本,请查看以下输出的最后一行:

git -c 'versionsort.suffix=-' ls-remote --tags --sort='v:refname' <repository>
仅输出使用 Semantic Versioning 的存储库的最新标记(例如在 shell 脚本中)用:
git -c 'versionsort.suffix=-' \
ls-remote --exit-code --refs --sort='version:refname' --tags <repository> '*.*.*' \
| tail --lines=1 \
| cut --delimiter='/' --fields=3
对于没有 --sort 的旧版 Git标志(v2.18 之前),或不支持的版本 versionsort.suffix (v2.4 之前)使用:
git ls-remote --refs --tags <repository> \
| cut --delimiter='/' --fields=3 \
| tr '-' '~' \
| sort --version-sort \
| tail --lines=1
sort 的旧版本没有 --version-sort标志超出了这个问题的范围......

长版
仅标签
使用 --tags确保列表只包含标签引用。
这将包括引用和取消引用的标签。这意味着有些标签会有 ^{}在 refname 的末尾。 (有关更多信息,请参阅 this question elsewhere on StackOverflow 。)
对于人类消费而言,这无关紧要,但如果您不想看到那些 ^{}的添加 --refs .
排序
可以使用 --sort 对引用列表进行排序.
sort 选项使用与 git for-each-ref 相同的排序键。 .由于我们在本地没有所有信息,因此并非所有选项都可供我们使用(例如与日期相关的排序键)。
我们想使用基于引用名称的版本排序。为此,我们使用 version:refname key 。这也可以缩写为 v:refname .
这将对版本进行升序排序,这意味着最新版本将是最后一个。
要反转列表,请在排序键前面加上 - : --sort='-v:refname' .
预发布排序
此时, 版本排序 将发布候选版本(例如 v2.28.0-rc2 )放在他们应该放在前面的稳定版本之后。
从 v2.12 开始,我们可以 use a configuration flag这告诉 Git 在没有该字符后缀的引用之后对具有特定字符后缀的引用名进行排序: git -c 'versionsort.suffix=-' .
始终使用 versionsort.suffix像这样,它可以全局设置:
git config --global 'versionsort.suffix' '-'
在 v2.4 和 v2.12 之间,标志被称为 versionsort.prereleaseSuffix .
在旧版本的 Git 中排序
对于较旧的 Git 版本,可以使用一个技巧:破折号字符 -排在空格前 但波浪号 ~在一个空格之后排序。
因此,通过替换破折号 -带波浪号 ~ ,事情按正确的顺序排序。这可以使用 tr '-' '~' 来完成
仅一行
由于我们并不真正关心所有输出,除了最后一行,我们只显示尾部: tail --lines=1 .当然,如果按降序检索列表(使用 --sort='-v:refname' ),这将是: head --lines=1 .
只是引用名称
ls-remote 命令的输出还输出引用哈希:
ada126bd28d66c8c8ff5966a52d63ce2c9e4d031        refs/tags/v2.28.0-rc0
为了只看到实际的标签(即引用名称),我们可以剪切该行的第一部分: cut --delimiter='/' --fields=3引用过滤器
最后要注意的是,可以给 ls-remote 一个过滤器以仅显示与过滤器模式匹配的引用。例如,对于语义版本控制,我们可以使用: '*.*.*' .任何与该模式不匹配的内容都不会显示。
如果存储库总是在版本标记前面加上 v ,可以进一步缩小到 'v*.*.*' .
另一个示例是仅检索特定主版本的最新标记。例如,要仅查看 repo 版本 2 的标签,我们可以使用 'v2.*' .
确保在过滤器周围使用引号,否则该星号 *会给你带来麻烦!
未找到引用
使用过滤器时,最好使用 --exit-code旗帜。
这是因为 Git 总是会以状态码 0 退出表明它成功地与远程存储库进行了对话。
对于人类消费,这很好,如果找到任何引用,您将在屏幕上看到。
但是,如果在 shell 脚本中使用此代码,则可能会出现问题。
可以告诉 Git 使用状态码 2当在远程存储库中找不到匹配的引用时。这是通过使用 --exit-code 来完成的。旗帜。
这样脚本就会知道什么时候出错了!
显然,如果没有使用过滤器,使用 --exit-code没有意义。
是时候举个例子了!
假设我们想知道 Git 的最新标签是什么。
我们会这样做:
git ls-remote --sort='version:refname' --tags https://github.com/git/git.git
这将返回一个按顺序排列所有标签的长列表,如下所示(为了理智而被截断)。
    ...

4c8bcdda4d6e4757caf876ddc401b5392e874e21 refs/tags/v2.28.0
ada126bd28d66c8c8ff5966a52d63ce2c9e4d031 refs/tags/v2.28.0-rc0
bd42bbe1a46c0fe486fc33e82969275e27e4dc19 refs/tags/v2.28.0-rc0^{}
49bfe36405d1631a303992cac5cc408980a0454e refs/tags/v2.28.0-rc1
3ddac3d691c3633cd4d9a74c07e3b2301f546f77 refs/tags/v2.28.0-rc1^{}
84a0d5cc2107b83a791aa4034cc54874e1d50668 refs/tags/v2.28.0-rc2
b066807397fd55553f4910ede74839e319b661fd refs/tags/v2.28.0-rc2^{}
47ae905ffb98cc4d4fd90083da6bc8dab55d9ecc refs/tags/v2.28.0^{}
这告诉我们最新的标签是 v2.28.0 .
另一个例子是设置 versionsort.suffix全局,然后只获取最后一个标签:
git config --global 'versionsort.suffix' '-'

git ls-remote --refs --sort=':refname' --tags https://github.com/git/git.git \
| tail --lines=1 | cut --delimiter='/' --fields=3
现在,让我们看看是否已经有 Git 的第 3 版!
$ git ls-remote --exit-code --refs --tags https://github.com/git/git.git 'v3.*'
$ echo $?
2 # nope, not yet

关于git - 从远程仓库获取最后一个 git 标签,无需克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10649814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com