如何通过GitHub API获取特定Push事件关联的所有Pull Requests
如何从Push事件关联的提交中便捷获取对应的Pull Requests?
我想知道怎么从特定Push事件(比如推送到main分支)里快速拿到关联的所有Pull Requests。目前已经从Push事件中获取到了提交列表:
"commits":[ { "id":"ac7196c04ba24f180d37d77209ae92d38ee9c222", "tree_id":"9a4abe48ace9e76d561be86ae822a39ff23456de", "distinct":false, "message":"Update x.txt", "timestamp":"2022-11-21T13:37:14+02:00", "url":"https://github.com/asf/asfasf/commit/ac7196c04ba24f180d37d77209ae92d38ee9c222", "author":{ "name":"myname", "email":"email", "username":"username" }, "committer":{ "name":"GitHub", "email":"noreply@github.com", "username":"web-flow" }, "added":[ ], "removed":[ ], "modified":[ "x.txt" ] }, { "id":"ac7196c04ba24f180d37d77209ae92d38ee9c111", "tree_id":"9a4abe48ace9e76d561be86ae822a39ff2342345", "distinct":false, "message":"Merge pull merge request #14 from x", "timestamp":"2022-11-21T13:37:14+02:00", "url":"https://github.com/asf/asfasf/commit/12313235235325", "author":{ "name":"myname", "email":"email", "username":"username" }, "committer":{ "name":"GitHub", "email":"noreply@github.com", "username":"web-flow" }, "added":[ ], "removed":[ ], "modified":[ "x.txt" ] } ]
我存在以下疑问:
- 无法区分哪个提交是来自其他分支的合并提交(若PR从分支A合并到分支B,再合并到main分支,我希望获取原始PR);
- 查看Pull Requests API后,发现似乎需要拉取所有数据,再通过提交关联对应PR,请问是否有更简洁的实现方式?
解决方案
1. 识别合并提交并追踪原始PR
- 快速识别合并提交:合并提交的消息通常包含
Merge pull request #XXX格式的内容(比如你提供的第二个提交),这类提交就是合并PR时生成的。另外,也可以通过Commit API查看提交的父提交数量——合并提交会有2个及以上父提交,普通提交只有1个。 - 追踪多层合并的原始PR:
- 如果是多层合并(A→B→main),先解析当前合并提交消息里的PR编号,获取该PR的详情,里面会包含被合并的分支信息;
- 再通过被合并分支的头提交SHA,调用Commit API获取该提交的关联PR,以此回溯就能找到最初的原始PR;
- 也可以直接通过提交的父提交链,找到最开始的非合并提交,再关联对应的PR。
2. 更高效的PR关联方式
不用拉取全量PR数据,有两种简洁方法:
- 单提交关联PR接口:使用
GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls接口,传入Push事件里每个提交的SHA值,直接返回该提交关联的所有PR,无需拉取所有PR数据。 - 利用合并提交的PR编号:对于已识别的合并提交,直接从消息里提取PR编号,调用
GET /repos/{owner}/{repo}/pulls/{pull_number}接口获取PR详情,这是最直接高效的方式。 - 批量查询优化:如果Push事件里有多个提交,可以用GitHub GraphQL API一次性查询多个提交的关联PR,减少HTTP请求次数,提升效率。
内容的提问来源于stack exchange,提问作者ArielB
相关产品推荐
相关产品推荐

