有没有办法使用 github API v3 获取给定存储库的最新标签

问题描述 投票:0回答:6

我对 github api 比较陌生,并且正在努力获取给定存储库的最新标签。

问: 为什么我需要它?

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

进入正题。

根据Github api获取给定仓库的所有标签是

GET /repos/:owner/:repo/tags

但这给出了存储库具有的标签的完整列表。

有没有一种简单的方法可以找到最新的标签,而无需迭代上述 api 调用中的所有可用标签?

如果我迭代每个标签以找到最新的标签(基于每个标签的时间戳),那么随着时间的推移,标签的数量将会增加,这显然不是执行此操作的有效方法,因为我想对至少 10 个以上的存储库重复相同的过程。

任何帮助将不胜感激。

git github-api
6个回答
22
投票

我发现的最简单的(对于我没有“最新”并且我不想签出分支的情况很有用)是:

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

这只是从(例如)相应的 certbot 标签页(位于 https://github.com/certbot/certbot/tags)打印“最高”标签号

感谢https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c#gistcomment-2649739


21
投票

GitHub 没有用于检索最新标签的 API,但它有用于“检索最新版本”的 API。这可能是因为标签可以是任意字符串,不一定是 semvers,但这并不是真正的借口,因为标签具有时间戳,并且 GitHub 在通过其 Tags API 返回标签时确实按字典顺序对标签进行排序。 无论如何,要获取最新的标签,您需要调用该API,然后根据

semver

规则对标签进行排序。由于这些规则并不简单(请参阅该链接的第 11 点),因此最好使用 semver 库为浏览器移植)。

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>


17
投票
https://api.github.com/repos/$org/$repo/releases/latest

 获取最新版本

如果您只想要标签名称,您可以尝试这样的操作:

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



8
投票
是否有一种简单的方法来“

git describe”远程存储库?

”中提到的简单脚本作为 GitHub API 的替代方案(
来源,作者: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

使用

6
投票
,您可以按字母顺序或提交日期获取最后一个标签。例如按提交日期(例如指向最近提交的标签):

{ 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 } } } } } } } }

在资源管理器中测试它

请注意,如果标签是轻量级标签,则不会有 tagger

message

 字段。您还可以使用 
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 } } } } } } } }

在资源管理器中测试它

    

我建议使用 awk

中的

0
投票

做一些简单的事情

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
    
    
        
    
    
© www.soinside.com 2019 - 2024. All rights reserved.