首页 > 解决方案 > 如何从 github api 获取所有标签

问题描述

我通常使用以下命令从 github API 获取版本/标签

$ repo="helm/helm"
$ curl -sL https://api.github.com/repos/${repo}/tags |jq -r ".[].name"

v3.2.0-rc.1
v3.2.0
v3.1.3
v3.1.2
v3.1.1
v3.1.0-rc.3
v3.1.0-rc.2
v3.1.0-rc.1
v3.1.0
v3.0.3
v3.0.2
v3.0.1
v3.0.0-rc.4
v3.0.0-rc.3
v3.0.0-rc.2
v3.0.0-rc.1
v3.0.0-beta.5
v3.0.0-beta.4
v3.0.0-beta.3
v3.0.0-beta.2
v3.0.0-beta.1
v3.0.0-alpha.2
v3.0.0-alpha.1
v3.0.0
v2.16.6
v2.16.5
v2.16.4
v2.16.3
v2.16.2
v2.16.1

但实际上,它并没有列出所有版本,我该怎么办?

例如,我无法在 v2.16.1 之前发布,如下链接

https://github.com/helm/helm/tags?after=v2.16.1

我尝试引用相同的方式添加?after=v2.16.1curl api 命令,但没有帮助

curl -sL https://api.github.com/repos/${repo}/tags?after=v2.16.1 |jq -r ".[].name"

我得到了相同的输出。

参考https ://developer.github.com/v3/git/tags/

标签: apigithubcurlpostman

解决方案


这可能是因为分页

将此脚本视为检测页面的示例,并添加?page=x从 GitHub API 调用访问所有数据所需的内容。

相关摘录:

# single page result-s (no pagination), have no Link: section, the grep result is empty                                                                                                                                                                  
last_page=`curl -s -I "https://api.github.com${GITHUB_API_REST}" -H "${GITHUB_API_HEADER_ACCEPT}" -H "Authorization: token $GITHUB_TOKEN" | grep '^Link:' | sed -e 's/^Link:.*page=//g' -e 's/>.*$//g'`

# does this result use pagination?                                                                                                                                                                                                                       
if [ -z "$last_page" ]; then
    # no - this result has only one page                                                                                                                                                                                                                 
    rest_call "https://api.github.com${GITHUB_API_REST}"
else
    # yes - this result is on multiple pages                                                                                                                                                                                                             
    for p in `seq 1 $last_page`; do
        rest_call "https://api.github.com${GITHUB_API_REST}?page=$p"
    done
fi

推荐阅读