You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:00:41