有没有一种方法可以使用github API v3获取给定仓库的最新标签

ac1kyiln  于 2023-03-28  发布在  Git
关注(0)|答案(6)|浏览(160)

我对github API相对较新,我很难获得给定repo的最新标签。


**A:**作为QA,我负责测试和发布到LIVE,我们的团队拥有大约40个工件(github中的repos)。我想构建一个工具,列出在最新标签之后提交的项目。这样我就可以更有效地管理发布。

说到点子上了
根据Github API获取给予存储库的所有标签的方法是

GET /repos/:owner/:repo/tags

但这给出了仓库所具有的标签的完整列表。
有没有一种简单的方法可以找到最新的标签,而不需要从上面的API调用中迭代所有可用的标签?
如果我为了找到最新的标签(基于每个标签的时间戳)而迭代每个标签,这显然不是有效的方法,随着时间的推移,标签的数量会增加,因为我想重复相同的过程至少超过10个repos。
任何帮助都将不胜感激。
先谢谢你了

p5fdfcr1

p5fdfcr11#

GitHub没有API来检索最新的标签,因为它有检索最新版本的API。这可能是因为标签可以是任意字符串,不一定是semvers,但这并不是一个真正的借口,因为标签有时间戳,GitHub在通过Tags API返回标签时会按字典顺序排序标签。
无论如何,要获得最新的标记,需要调用该API,然后根据semver规则对标记进行排序,因为这些规则并不简单(请参见该链接的第11点),所以最好使用the semver libraryported for the browser)。

const gitHubPath = 'dandv/local-iso-dt';  // example repo
const url = 'https://api.github.com/repos/' + gitHubPath + '/tags';

$.get(url).done(data => {
  const versions = data.sort((v1, v2) => semver.compare(v2.name, v1.name));
  $('#result').html(versions[0].name);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/hippich/bower-semver/master/semver.min.js"></script>
<p>Latest tag: <span id="result"></span></p>
2w3rbyxf

2w3rbyxf2#

您可以在https://api.github.com/repos/$org/$repo/releases/latest上获得最新版本
如果你只想要标签名,你可以尝试这样做:

curl https://api.github.com/repos/$org/$repo/releases/latest -s | jq .name -r
kjthegm6

kjthegm63#

我发现最简单的(对我的情况很有用,没有“最新”,我不想 checkout 分支)是:

curl  "https://api.github.com/repos/certbot/certbot/tags" | jq -r '.[0].name'

该jus打印来自(例如)对应的certbot标签页(在https://github.com/certbot/certbot/tags处)的“最高”标签号。
https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c#gistcomment-2649739

68de4m5k

68de4m5k4#

你可以考虑,作为GitHub API的替代方案,在“Is there a simple way to “ git describe ” a remote repository?”(source,作者svnpenn)中提到的一个简单脚本:

#!/usr/bin/awk -f
BEGIN {
  if (ARGC != 2) {
    print "git-describe-remote.awk https://github.com/stedolan/jq"
    exit
  }
  FS = "[ /^]+"
  while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) {
    if (!sha)
      sha = substr($0, 1, 7)
    tag = $3
  }
  while ("curl -s " ARGV[1] "/releases/tag/" tag | getline)
    if ($3 ~ "commits")
      com = $2
  printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha
}

这确实提取了标签(以及更多),而不必克隆存储库。
注意:正如下面Joels Elf所注解的,确保/usr/bin/awk指的是gawk,而不是mawk

xmq68pz9

xmq68pz95#

使用GraphQL API v4,你可以通过字母顺序或提交日期来获取最后一个标签。例如,通过提交日期(例如,指向最近提交的标签):

{
  repository(owner: "bertrandmartel", name: "caipy-dashboard") {
    refs(refPrefix: "refs/tags/", first: 1, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
      edges {
        node {
          name
          target {
            oid
            ... on Tag {
              message
              commitUrl
              tagger {
                name
                email
                date
              }
            }
          }
        }
      }
    }
  }
}

test it in the explorer
请注意,如果标签是轻量级标签,则不会有taggermessage字段。您也可以按字母顺序为最后一个标签使用field: ALPHABETICAL
如果你想获取最后一个被创建的标签(它可能与指向最近提交的标签不同,也可能与按字母顺序排列的最后一个标签不同),只有带注解的标签才有可能,因为它们的创建日期是存储的,并且可以在tagger字段中找到。
要获取最后创建的标签,您需要获取所有标签,并在以下请求的响应中的data.repository.refs.edges.node.target.tagger.date字段中过滤最近的日期:

{
  repository(owner: "google", name: "gson") {
    refs(refPrefix: "refs/tags/", first: 100, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
      edges {
        node {
          name
          target {
            oid
            ... on Tag {
              commitUrl
              tagger {
                date
              }
            }
          }
        }
      }
    }
  }
}

test it in the explorer

wpx232ag

wpx232ag6#

我建议使用awkbash简单的东西
curl https://api.github.com/repos/{organization}/{repository_name}/releases/latest | grep -i "tag_name" | awk -F '"' '{print $4}'

  • curl获取最新版本信息
  • grep查找字段**“tag_name”:“1.1.1”**
  • awk解析**“tag_name”:“1.1.1”改为1.1.1**

相关问题