通过HTTP请求访问GitHub私有库branch_commits页面返回404如何解决?
问题根因
你访问的https://github.com/:org/:repo/branch_commits/:sha是GitHub的前端渲染页面,不属于官方开放API的路径,不支持API令牌的Authorization头鉴权,只有携带浏览器登录态的Cookie才能正常访问私有仓库的该路径,所以你携带API令牌请求会返回404。
可行解决思路
- 方案1:使用GitHub GraphQL API查询(最推荐,官方支持)
GitHub GraphQL API支持直接查询指定commit关联的分支,你可以构造如下查询语句,使用普通的API令牌即可正常鉴权访问私有仓库:
query($owner: String!, $repo: String!, $commitOid: GitObjectID!) { repository(owner: $owner, name: $repo) { object(oid: $commitOid) { ... on Commit { associatedRefs(first: 100, refPrefix: "refs/heads/") { nodes { name } } } } } }
查询返回的associatedRefs.nodes里的name就是包含该commit的所有分支名。
- 方案2:使用REST API遍历校验(适合分支数量少的场景)
如果不想用GraphQL,也可以通过两步实现:
- 调用
GET /repos/{owner}/{repo}/branches接口拉取仓库所有分支列表 - 对每个分支调用
GET /repos/{owner}/{repo}/branches/{branch}/commits/{sha}接口,如果返回204状态码,说明该分支包含对应commit,返回404则不包含。
该方案的缺点是如果仓库分支数量多,请求量会很大,效率较低。
- 方案3:模拟浏览器请求前端页面(不推荐)
如果一定要解析branch_commits页面的HTML,需要携带完整的浏览器登录Cookie发起请求,不过该方式会触发GitHub的反爬策略,也不符合GitHub的服务使用条款,不建议生产环境使用。
内容的提问来源于stack exchange,提问作者Iris Louis
相关产品推荐
相关产品推荐

