【问题标题】:How can I get a list of all pull requests for a repo through the github API?如何通过 github API 获取 repo 的所有拉取请求列表?
【发布时间】:2013-07-02 10:48:26
【问题描述】:

我想通过 github API 获取 repo 上所有拉取请求的列表。

我已按照 http://developer.github.com/v3/pulls/ 的说明进行操作,但是当我查询 /repos/:owner/:repo/pulls 时,它返回的拉取请求始终比网站上显示的要少。

例如,当我查询 torvalds/linux 存储库时,我收到 9 个打开的拉取请求(网站上有 14 个)。如果我添加?state=closed,我会收到一组不同的 11 个关闭的拉取请求(网站显示大约 20 个)。

有谁知道这种差异是在哪里出现的,是否有任何方法可以通过 API 获取 repo 的拉取请求的完整列表?

【问题讨论】:

  • 你能再检查一下吗?做了一个测试,预期 19,得到 19

标签: github github-api pull-request


【解决方案1】:

您可以通过变量state 获取所有拉取请求(关闭、打开、合并)。

只要在 GET 查询中设置state=all,像这样->

https://api.github.com/repos/:owner/:repo/pulls?state=all

更多信息:查看https://developer.github.com/v3/pulls/#list-pull-requests的参数表

编辑:根据 Tomáš Votruba 的评论:

“per_page=30”的默认值。最大值为 per_page=100。要获得超过 100 个结果,您需要调用多个 item:"&page=1"、"&page=2"...

【讨论】:

  • 如何从得到的结果中只过滤掉pull request号
  • 我的问题是,如果我 GET ?state=all,它给出的数字小于 ?state=close + ?state=open
  • 重要:“per_page=30”的默认值。最大值为 per_page=100。要获得超过 100 个结果,您需要调用多个 item:"&page=1"、"&page=2"...
  • 我们怎么知道还有更多的页面?好像没有响应属性
  • 私有仓库怎么样?
【解决方案2】:

PyGithub (https://github.com/PyGithub/PyGithub),一个用于访问 GitHub API v3 的 Python 库,使您能够获取分页资源。

例如,

g = Github(login_or_token=$YOUR_TOKEN, per_page=100)
r = g.get_repo($REPO_NUMBER)

for pull in r.get_pulls('all'):
    # You can access pulls

请参阅文档 (http://pygithub.readthedocs.io/en/latest/index.html)。

【讨论】:

    【解决方案3】:

    用Github新官方CLI(命令行界面):

    gh pr list --repo OWNER/REPO
    

    这会产生类似的东西:

    Showing 2 of 2 pull requests in OWNER/REPO
    
    #62  Doing something    that-weird-branch-name
    #58  My PR title        wasnt-inspired-branch
    

    查看更多 details and optionsinstallation instructions

    【讨论】:

      【解决方案4】:
      1. 如果要检索所有拉取请求(提交、cmets、问题等),则必须使用分页。 https://developer.github.com/v3/#pagination

      2. GET 请求“拉取”只会返回打开的拉取请求。

      3. 如果要获取所有拉取请求,请将参数状态设置为 all,或者使用问题。

      额外信息

      如果您需要来自 Github 的其他数据,例如问题,那么您可以从问题中识别拉取请求,然后您可以检索每个拉取请求,无论它是关闭还是打开。它还将为您提供更多属性(可合并、合并、merge-commit-sha、nr of commits 等) 如果问题是拉取请求,那么它将包含该属性。否则,这只是一个问题。

      来自 API: https://developer.github.com/v3/pulls/#labels-assignees-and-milestones

      “每个拉取请求都是一个问题,但并非每个问题都是一个拉取请求。因此,问题 API 中提供了两个功能的“共享”操作,例如操作受让人、标签和里程碑。”

      编辑我刚刚发现问题的行为类似于拉取请求,因此需要通过将 state 参数设置为 all 来检索所有内容

      【讨论】:

      • 能否提供获取所有拉取请求的代码(状态为all
      • 请原谅我的提问,我只是看到它是由@akshaynagpal 提供的
      【解决方案5】:

      有一种方法可以获得完整的列表,而您正在这样做。您使用什么与 API 进行通信?我怀疑你可能没有正确地做某事。例如(目前只有 13 个打开的拉取请求)使用我的 API 包装器(github3.py)我得到所有打开的拉取请求。在没有我的 python 包装器的情况下如何做到这一点的一个例子是:

      import requests
      r = requests.get('https://api.github.com/repos/torvalds/linux/pulls')
      len(r.json()) == 13
      

      我也可以通过自己计算结果在 cURL 中(模糊地)获得该结果:curl https://api.github.com/repos/torvalds/linux/pulls

      但是,如果您遇到包含超过 25 个(或 30 个)拉取请求的存储库,这是一个完全不同的问题,但肯定不是您现在遇到的问题。

      【讨论】:

      • 有没有办法获得超过 30 个请求的 repo?也许在不同的网络请求中?
      • @shreyj GitHub API 上的许多端点都是分页的,可以使用响应中的 Link headers 访问。如果您尝试使用 python 或 ruby​​ 发出请求,我当然可以为您提供更多帮助。
      【解决方案6】:

      搜索 API 应该帮助:https://help.github.com/enterprise/2.2/user/articles/searching-issues/

      q = repo:org/name is:pr ...

      【讨论】:

        【解决方案7】:

        GitHub 提供了一个“链接”标头,它指定上一个、下一个和最后一个 URL 以获取值。例如,链接标头响应, <https://api.github.com/repos/:owner/:repo/pulls?state=all&page=2>; rel="next", <https://api.github.com/repos/:owner/:repo/pulls?state=all&page=15>; rel="last" rel="next" 建议下一组值。

        【讨论】:

          【解决方案8】:

          您还可以使用GraphQL API v4 请求所有拉取请求以获取 repo。如果您不指定 states 字段,它将默认请求所有拉取请求:

          {
            repository(name: "material-ui", owner: "mui-org") {
              pullRequests(first: 100, orderBy: {field: CREATED_AT, direction: DESC}) {
                totalCount
                nodes {
                  title
                  state
                  author {
                    login
                  }
                  createdAt
                }
              }
            }
          }
          

          Try it in the explorer

          【讨论】:

            猜你喜欢
            • 2017-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-18
            • 2015-11-17
            • 1970-01-01
            • 2020-10-28
            相关资源
            最近更新 更多