如何通过Git REST API跨页拉取GitHub团队下的全量仓库
问题原因
这是GitHub REST API的默认分页规则导致的,所有列表类接口默认单页返回30条结果,没做分页处理的话,自然只能拿到第一页的30条数据。
解决方法
核心是按照API的分页规则遍历所有页,直到拉完所有数据,具体操作如下:
核心分页参数
调用接口时在URL后拼接两个查询参数控制分页:
per_page:指定单页返回的条目数,最大支持设置为100,设置为最大值可以减少总请求次数page:指定当前请求的页码,从1开始计数
分页终止判断
不要自己硬编码页码,优先通过接口响应头的Link字段判断是否还有下一页:
GitHub列表类接口的响应头中,
Link字段会标注分页导航关系,包含rel="next"标记时代表存在下一页,包含rel="last"标记时代表是最后一页。如果当前响应头里找不到rel="next"对应的链接,说明已经拉取到所有数据,可以终止请求。
如果不想解析响应头,也可以用兜底判断:当当前页返回的条目数小于你设置的per_page值时,说明已经到最后一页,但这个方法有概率出现最后一页条目数刚好等于per_page的边界情况,优先用Link头判断更稳妥。
实现步骤
- 初始化当前请求页码为1,创建空数组存储所有拉取到的仓库数据
- 构造请求地址,拼接
per_page=100和当前page参数,首次请求示例:https://api.github.com/orgs/ORG/teams/TEAM/repos?per_page=100&page=1 - 发起请求,将当前页返回的仓库列表追加到总结果数组中
- 检查本次响应的
Link头:- 存在
rel="next"标记:页码加1,回到步骤2继续请求下一页 - 不存在
rel="next"标记:结束循环,此时总结果数组即为全量仓库数据
- 存在
简化方案
如果你使用GitHub官方提供的Octokit系列SDK,不需要手动写分页循环,SDK内置了自动分页能力,开启对应配置后调用接口可直接返回全量数据。
注意事项
- 不要将
per_page设置为大于100的数值,API不会支持该设置,会自动回退到单页100条的规则 - 所有请求建议携带合法的身份鉴权token,未认证的请求速率限制极低,且无法拉取团队下的私有仓库数据
- 拉取大量数据时注意控制请求频率,避免触发速率限制导致请求被拦截
内容的提问来源于stack exchange,提问作者JHotop85
相关产品推荐
相关产品推荐

