我对 github api 比较陌生,并且正在努力获取给定存储库的最新标签。
问: 为什么我需要它?
A: 作为 QA,我负责测试并发布到 LIVE,我们的团队拥有大约 40 个工件(github 中的存储库)。我想构建一个工具,列出在最新标签之后提交的项目。这样我就可以更有效地管理发布。
进入正题。
根据Github api获取给定仓库的所有标签是
GET /repos/:owner/:repo/tags
但这给出了存储库具有的标签的完整列表。
有没有一种简单的方法可以找到最新的标签,而无需迭代上述 api 调用中的所有可用标签?
如果我迭代每个标签以找到最新的标签(基于每个标签的时间戳),那么随着时间的推移,标签的数量将会增加,这显然不是执行此操作的有效方法,因为我想对至少 10 个以上的存储库重复相同的过程。
任何帮助将不胜感激。
我发现的最简单的(对于我没有“最新”并且我不想签出分支的情况很有用)是:
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
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>
https://api.github.com/repos/$org/$repo/releases/latest
获取最新版本如果您只想要标签名称,您可以尝试这样的操作:
curl https://api.github.com/repos/$org/$repo/releases/latest -s | jq .name -r
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
。使用
在资源管理器中测试它
请注意,如果标签是轻量级标签,则不会有 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
做一些简单的事情
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"