如何用GitHub GraphQL API查询任意状态提交关联的Pull Request
如何通过GitHub GraphQL API查询指定Commit关联的任意状态Pull Request?
我手里有一批GitHub仓库的Commit哈希值,需要自动查询每个提交关联的Pull Request(PR)以及PR的状态(打开/关闭、是否合并等)。一开始用GitHub REST API的搜索功能,但受限于每分钟30次的请求速率限制,所以换成了认证后每小时5000次请求限制的GraphQL API。
我写了下面的GraphQL查询和变量,但这个查询只能返回已合并状态的关联PR:
原GraphQL查询
query ($repoOwner: String!, $repoName: String!, $sha: String!) { repository(name: $repoName, owner: $repoOwner) { commit: object(expression: $sha) { ... on Commit { commitUrl associatedPullRequests(first: 10) { edges { node { title number body state mergedAt closedAt } } } } } } }
原变量
{ "repoOwner": "<REPOSITORY_OWNER>", "repoName": "<REPOSITORY_NAME>", "sha": "<COMMIT_HASH>" }
比如numpy仓库里,已合并的PR #23753对应的Commit哈希725777de1b8dea22edf9421a47ccf0807b477ae7能正常查到PR信息,但未合并的PR #23751对应的Commit哈希ab2bd9d9b997a315d2c4e3175ba03ab3a435543d查询结果为空,而用REST API的搜索接口却能正常获取到这个PR的信息。
解决方案
问题出在associatedPullRequests字段的默认行为:它只返回已合并到仓库默认分支的PR。要获取所有状态的关联PR,有两种可行方案:
方案1:查询以该Commit为HEAD的所有PR
直接使用pullRequests字段,通过headRefOid参数匹配Commit哈希,并显式指定要包含的PR状态:
query ($repoOwner: String!, $repoName: String!, $sha: String!) { repository(name: $repoName, owner: $repoOwner) { pullRequests( first: 10, headRefOid: $sha, states: [OPEN, CLOSED, MERGED] ) { edges { node { title number body state mergedAt closedAt # 可选:验证PR的HEAD提交是否匹配目标哈希 headRef { target { ... on Commit { oid } } } } } } } }
headRefOid: $sha:精准匹配所有HEAD引用指向该Commit的PR,不管PR是否合并。states: [OPEN, CLOSED, MERGED]:显式指定返回所有状态的PR,避免默认过滤(虽然默认pullRequests会返回所有状态,但显式指定更稳妥)。
方案2:搜索包含该Commit的所有PR
如果Commit是PR中的非HEAD提交(比如PR包含多个Commit),方案1无法覆盖,这时可以用GraphQL的search字段,按Commit哈希搜索PR,速率限制和普通GraphQL请求一致:
query ($queryString: String!) { search(query: $queryString, type: ISSUE, first: 10) { edges { node { ... on PullRequest { title number body state mergedAt closedAt } } } } }
变量示例:
{ "queryString": "repo:<OWNER>/<REPO> type:pr sha:<COMMIT_HASH>" }
内容的提问来源于stack exchange,提问作者CuriosityCalls
相关产品推荐
相关产品推荐

