如何同时获取GitHub文件内容及提交数据?
问题描述
我尝试将GitHub用作静态Markdown文件的CMS,因其集成简单且免费。通过GitHub的REST API可轻松获取文件内容,目前已能通过返回的download_url获取Markdown内容,这部分运行正常。
但我还希望获取文件的提交数据(如最后修改日期),不想手动在Markdown前置元数据中添加该信息。我也试过用GraphQL探索工具,但拿到的数据没什么区别。Contents API会返回仓库中每个文件的sha值,但我不知道如何关联它,用Commits API查询时无结果返回。
我尝试的GQL查询如下:
{ repository(owner: "[OWNER]", name: "[REPO]") { object(expression: "main:[FOLDER-PATH]") { ... on Tree { entries { name object { commitUrl ... on Blob { text } } } } } } }
此处返回的commitUrl即使携带token请求也会返回404。
解决方案
方法一:通过REST API关联文件SHA获取提交记录
拿到Contents API返回的文件sha后,调用/repos/{owner}/{repo}/commits接口,指定path为目标文件路径,同时传入sha参数(文件的sha值)过滤结果。示例请求:
GET /repos/{owner}/{repo}/commits?path={file-path}&sha={file-sha}
接口会返回所有修改过该文件的提交记录,取第一条即可得到最新修改信息,其中commit.committer.date字段就是最后修改日期。
方法二:修正GraphQL查询获取提交信息
之前的GQL查询中commitUrl无效,是因为未正确关联提交节点。可以修改查询直接获取文件的最新提交信息:
{ repository(owner: "[OWNER]", name: "[REPO]") { file(path: "[FILE-PATH]", branch: "main") { blob { text } latestCommit { committedDate committer { name } message } } } }
如果需要批量获取文件夹下所有文件的信息,可先遍历Tree的entries拿到每个文件的path,再批量请求每个文件的latestCommit数据,示例基础查询:
{ repository(owner: "[OWNER]", name: "[REPO]") { object(expression: "main:[FOLDER-PATH]") { ... on Tree { entries { name path object { ... on Blob { text } } } } } } }
注意事项
- 确保使用的token拥有足够权限(私有仓库需
repo权限) - 批量查询时注意GitHub API的速率限制,避免触发限流
内容的提问来源于stack exchange,提问作者jbukuts
相关产品推荐
相关产品推荐

