我是github api的新手,我正在努力获得给定回购的最新标签.
问: 为什么我需要那个?
答: 作为QA,我负责测试并发布到LIVE,我们的团队拥有大约40件文物(github中的回购).我想构建一个工具,列出在最新标记之后提交的项目.这样我就可以更有效地管理版本.
即将到来.
根据Github api获得一个回购的所有标签
GET /repos/:owner/:repo/tags
Run Code Online (Sandbox Code Playgroud)
但是这给出了repo具有的完整标签列表.
有没有一种简单的方法可以找到最新的标签,而无需迭代上述api调用中的所有可用标签?
如果我遍历每个标签以找到最新的标签(基于每个标签的时间戳),那么随着时间的推移,这显然不是有效的方式,标签的数量会增加,因为我想重复至少超过10个回购的相同过程.
任何帮助将受到高度赞赏.
提前谢谢了
eli*_*eli 22
我发现的最简单的(对于我没有“最新”且我不想签出分支的情况很有用)是:
curl "https://api.github.com/repos/certbot/certbot/tags" | jq -r '.[0].name'
Run Code Online (Sandbox Code Playgroud)
这只是从(例如)相应的 certbot 标签页(位于https://github.com/certbot/certbot/tags)打印“最高”标签号
感谢https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c#gistcomment-2649739
Dan*_*scu 11
GitHub没有用于检索最新标记的API,因为它用于检索最新版本.这可能是因为标签可能是任意字符串,不一定是semvers,但它并不是真正的借口,因为标签有时间戳,GitHub通过其标签API返回它们时按字典顺序对标签进行排序.
无论如何,要获取最新标记,您需要调用该API,然后根据semver规则对标记进行排序.由于这些规则不重要(参见该链接的第11点),因此最好使用semver库(为浏览器移植).
var gitHubPath = 'iDoRecall/selection-menu'; // example repo
var url = 'https://api.github.com/repos/' + gitHubPath + '/tags';
$.get(url).done(function (data) {
var versions = data.sort(function (v1, v2) {
return semver.compare(v2.name, v1.name)
});
$('#result').html(versions[0].name);
});
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
您可以考虑作为GitHub API的替代方案,使用“ 是否有一种简单的方法来“ git describe
”远程存储库? ”(source,by 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
}
Run Code Online (Sandbox Code Playgroud)
那确实提取了标签(以及更多),而无需克隆仓库。
注意:如Joels Elf 在下面的评论中,请确保引用,而不是。/usr/bin/awk
gawk
mawk
您可以在以下位置获得最新版本 https://api.github.com/repos/$org/$repo/releases/latest
如果你只想要标签名称,你可以尝试这样的事情:
curl https://api.github.com/repos/$org/$repo/releases/latest -s | jq .name -r
Run Code Online (Sandbox Code Playgroud)
使用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
}
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果标签是轻量级标签,则不会有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
}
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)