You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过GitHub API获取提交对比的全部文件?处理300上限及缺失判断

嘿,这两个问题我刚好在做代码变更分析工具时踩过坑,给你分享下实操的解决方案:

1. 通过GitHub API获取两次提交对比的所有文件

你可以用GitHub的Compare API来直接获取两次提交(或分支、标签)之间的文件差异,接口格式是:

GET /repos/{owner}/{repo}/compare/{base}...{head}

这里的{base}{head}可以是提交的完整SHA哈希、分支名(比如main)、标签名,甚至是短SHA(只要能唯一识别提交)。

接口返回的响应里,files字段就是两次提交对比中所有变更的文件列表,每个文件条目会包含文件名、变更类型(添加/修改/删除)、差异内容等信息。举个实际请求的例子,对比repo-owner/my-repo仓库中abc123def456两个提交:

GET /repos/repo-owner/my-repo/compare/abc123...def456
2. 突破300个文件限制,或检测文件缺失

确实,GitHub的Compare API默认最多返回300个文件,当对比的文件数量超过这个数时,API会做截断处理。不过你可以通过以下两种方式处理:

检测是否有缺失的文件

当返回的文件被截断时,响应体里会多出一个too_many_files字段,值为true。你可以通过检查这个字段来判断当前的files列表是否不完整,有没有遗漏的文件。

获取全部文件的方案

如果需要拿到完整的文件列表,Compare API就不够用了,得换个思路:遍历两次提交之间的所有单次提交,逐个获取每个提交的变更文件,最后合并去重。具体步骤如下:

  • 先用Compare API获取两次提交之间的所有commit列表:接口返回的commits字段就是从basehead的所有提交记录(按时间排序)。
  • 对每个commit,调用Commit Details API获取该提交的所有变更文件:
    GET /repos/{owner}/{repo}/commits/{commit-sha}
    
    这个接口返回的files字段是该单次提交的所有变更文件,没有300个的限制。
  • 把所有commit的files列表合并,对文件名做去重(同一个文件可能在多个commit中被修改),就能得到两次提交对比的完整文件集合。

注意:如果两次提交之间的commit数量很多,Commit Details API的请求会比较多,记得遵守GitHub API的速率限制(一般是每小时5000次请求),公开仓库基本够用,私有仓库可以适当调整请求频率。

内容的提问来源于stack exchange,提问作者IronMensan

火山引擎 最新活动