【问题标题】:How to get list of latest tags in remote git?如何获取远程 git 中的最新标签列表?
【发布时间】:2014-01-11 02:52:11
【问题描述】:

当你有本地 git repo 时,有很多方法可以获取最新的标签。

但我想获取远程仓库的最新标签列表。

我知道“git ls-remote”,当您使用 x.y.z(其中 x、y、z 是数字)之类的标签时,一切都很好。 但是当标签看起来像“test-x.y.z”和“dev-x.y.z”时,我注意到大量的“test”标签会拉出任何新的“dev”标签,这是不正确的。

那么,你想如何解决这个问题?

【问题讨论】:

  • 你是说有很多“test”标签会导致“dev”标签不包含在git ls-remote的输出中吗?我觉得很难相信。如果您指定标签模式以将输出限制为仅需要的标签 (git ls-remote ... dev-*) 会怎样?
  • 我是说,如果我只需要最后 10 个标签 - 如果有 10 个或更多“测试”标签,我将看不到任何新的“开发”标签。
  • 我正在尝试让 groovy 脚本按我的需要工作。我在那里看到的 Groovy 脚本:stackoverflow.com/questions/7157170/…
  • 注意:使用 Git 2.18(2018 年第二季度),您现在拥有 git ls-remote --sort:请参阅 my answer below

标签: git tags


【解决方案1】:

在 Git 2.18(2018 年第二季度)中,git ls-remote 学习了一个选项,允许根据显示的引用名对其输出进行排序。

参见Harald Nordgren (HaraldNordgren)commit 1fb20df(2018 年 4 月 9 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 6c0110f,2018 年 5 月 8 日)

ls-remote:创建“--sort”选项

基于来自for-each-ref 的选项,为ls-remote 创建一个“--sort”选项。
这例如允许引用名称按版本语义排序,以便v1.2 排在v1.10 之前。

请查看那些for-each-ref --sort options introduced in Git 2.0 and 2.8,因为它们现在适用于git ls-remote --sort

【讨论】:

    【解决方案2】:
    git ls-remote --tags | awk -F'/' '/[0-9].[0-9].[0-9].*/ { print $3}' | sort -nr | head -n1
    

    使用github api:

    curl https://api.github.com/repos/user/repo/tags | jq '.[] .name' | sort -nr | head -n1
    

    这两个将为您获取最新标签,您可以通过更改头管n 标志处的值来增加列表。比方说,获取前 10 个最新列表 head -n10

    【讨论】:

    • 我将 -r 添加到 jq 调用以从输出标签名称中删除 "
    • @Marcin,罗杰。谢谢!
    • 这个只能处理个位数的版本号。在 0.0.19 和 0.0.2 等方面失败
    【解决方案3】:

    有人告诉我这个命令:

    git ls-remote -t repo.url.git | awk '{print $2}' | cut -d '/' -f 3 | cut -d '^' -f 1  | sort -b -t . -k 1,1nr -k 2,2nr -k 3,3r -k 4,4r -k 5,5r | uniq
    

    这不是最好的解决方案,但他让我看到了命令sort

    但我想知道其他版本。

    【讨论】:

    • @RandyLai 你有没有弄清楚如何获得可以处理 0.0.19 和 0.0.2 的正确订单?
    • 这是我用的:git ls-remote --tags | sed 's|.*/\(.*\)$|\1|' | grep -v '\^' | sort -t. -k1,1nr -k2,2nr -k3,3nr
    【解决方案4】:

    你使用Linux吗?如果是这样,您可以使用此命令

    git ls-remote --tags | grep -o 'refs/tags/dev-[0-9]*\.[0-9]*\.[0-9]*' | sort -r | head | grep -o '[^\/]*$'
    

    它将显示 10 个最新标签(名称为 dev-x.y.z

    UPD
    你可以使用这个 bash 脚本来获取最新的标签:

    #!/bin/bash
    
    TAGS=("dev-[0-9]*\.[0-9]*\.[0-9]*" "test-[0-9]*\.[0-9]*\.[0-9]*" "good-[0-9]*" "new [0-9][0-9][0-9]")
    
    for index in ${!TAGS[*]}
    do
        git ls-remote --tags | grep -o "refs/tags/${TAGS[$index]}" | sort -rV | head | grep -o '[^\/]*$'
    done
    

    只需添加您想要的数组 TAGS 正则表达式,您将获得每个标签的 10 个最新标签。如果您想获得更多或更少的标签,只需将参数 -n 添加到 head 命令 'head -n 5' 或 'head -n 15' 即可。

    以防万一。将其保存在文件夹 ~/bin 中(例如名称为 git_tags),然后添加可执行权限(chmod +x git_tags),这将允许您从每个地方运行此 bash 脚本(只需输入 git_tags)。

    【讨论】:

    • 但它只会对“dev”标签进行排序。但是,谢谢...我会这样想
    • 是否需要同时获取两个标签(开发和测试)?
    • 是的!实际上,使用任何其他标签都是很不错的,例如:new-xxx、good-dd.mm.dd、dd.mm.dd。或任何其他。但如果这是不可能的 - 没关系。
    • 我写了一个小 bash 脚本,你可以用它来获取你想要的标签。此外,如果您希望能够仅获取一种类型的标签(仅开发或仅测试),我可以编写脚本来完成它
    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多