如何通过GitHub API获取指定文件的全部提交记录?
嘿,这个问题我太熟悉了!GitHub API默认确实只返回30条提交结果,要拿到那3000条完整记录,得靠这几个方法,我给你一步步说清楚:
方法1:利用GitHub REST API的分页机制
GitHub REST API的分页是核心解决方案,默认每页30条,但我们可以调整参数来减少请求次数:
- 首先,请求时加上
per_page=100参数(这是API允许的最大单页数量),这样每次能拿100条,3000条只需要30次请求:https://api.github.com/repos/raspberrypi/linux/commits?path=drivers/gpu/drm/i915/intel_display.c&per_page=100 - 然后,查看响应的HTTP头里的
Link字段,里面会包含next(下一页链接)、last(最后一页链接)等标记。你只需要跟着next链接不断请求,直到返回的结果为空数组,或者Link里没有next为止。 - 小提示:未认证的API请求每小时只能调用60次,30次请求完全够用;如果怕限流,最好用**个人访问令牌(PAT)**认证,这样每小时能调用5000次,更稳妥。
方法2:直接用Git命令(最简单高效)
如果只是需要导出或查看该文件的所有提交,直接用Git命令比调用API省事多了:
- 先克隆仓库(如果还没克隆的话):
git clone https://github.com/raspberrypi/linux.git - 进入仓库目录后,用
git log只筛选这个文件的提交:# 简洁格式展示,每条提交一行 git log --oneline -- drivers/gpu/drm/i915/intel_display.c - 如果需要结构化数据(比如JSON),可以用
git log的格式化参数自定义输出:
把输出稍微整理一下(去掉最后一个逗号,包裹上git log --pretty=format:'{"commit_id":"%H","author":"%an","commit_date":"%ad","message":"%s"},' -- drivers/gpu/drm/i915/intel_display.c[])就是标准的JSON数组,方便后续处理。
方法3:使用GitHub GraphQL API(更灵活)
如果你需要自定义返回的字段(比如只拿提交ID、作者、消息),GraphQL API会更高效,它支持通过游标(cursor)分页:
下面是一个示例查询,你可以在GitHub的GraphQL Explorer里直接测试:
query GetFileCommits($cursor: String) { repository(owner: "raspberrypi", name: "linux") { ref(qualifiedName: "main") { target { ... on Commit { history( path: "drivers/gpu/drm/i915/intel_display.c" first: 100 after: $cursor ) { pageInfo { hasNextPage endCursor } nodes { oid author { name date } messageHeadline } } } } } } }
- 第一次请求时
cursor留空,拿到结果后如果pageInfo.hasNextPage是true,就把pageInfo.endCursor作为下一次请求的cursor参数,直到hasNextPage变为false,这样就能拿到所有提交。
内容的提问来源于stack exchange,提问作者Josh




