如何通过GitHub API低请求量获取仓库完整递归文件列表
递归获取GitHub仓库全量文件列表(最小请求数实现)
针对小型SVG资源仓库拉取全量文件、避免大量API请求的需求,直接用GitHub Tree API原生的递归参数即可,最多2次请求就能拿全所有层级的文件,完全不需要逐级遍历目录。
核心认知纠正
直接传commit SHA给tree接口确实无法正常返回结果——commit和tree是Git里两类独立的对象,但根目录对应的tree SHA根本不需要复杂查询,它直接存在分支最新提交的返回结构里。
具体实现步骤
1. 获取仓库根目录的tree SHA
直接请求目标分支的最新commit接口即可,以默认分支main为例:
curl -s https://api.github.com/repos/<你的用户名>/<仓库名>/commits/main
在返回的JSON结构中,取.commit.tree.sha字段的值,就是整个仓库根目录对应的tree SHA。
要查询其他分支、指定tag的文件树,直接把URL末尾的
main替换成对应分支名、tag名即可。
2. 单请求拉取全量递归文件结构
拿到根tree SHA后,调用tree接口时带上recursive=1查询参数,接口会自动递归展开所有层级的子目录,一次性返回全量文件列表:
curl -s https://api.github.com/repos/<你的用户名>/<仓库名>/git/trees/<上一步获取的根tree SHA>?recursive=1
返回结果的tree数组就是所有文件和目录的集合:
path字段是对应条目相对于仓库根目录的完整路径type值为blob的是文件,值为tree的是子目录- 同时会返回文件大小、对应blob的SHA值,足够支撑资源仓库的文件索引需求
方案适配性说明
- 这套方案对6级目录、约200个文件的场景完全适用,GitHub的递归tree接口最大支持返回单仓库10万个条目,不会出现截断
- 公开仓库调用不需要鉴权,私有仓库在curl命令中添加请求头
-H "Authorization: Bearer <你的GitHub个人访问令牌>"即可 - 全程最多产生2次API请求,完全不会出现逐级遍历目录导致的数十上百次请求的问题
内容的提问来源于stack exchange,提问作者Dan Donaldson
相关产品推荐
相关产品推荐

