如何通过Github API获取存储库的所有拉取请求列表?

47

我希望通过Github API获得仓库中所有拉取请求的列表。

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

例如,当我查询torvalds/linux仓库时,我只得到9个开放的拉取请求(网站上有14个)。如果我添加?state=closed,我会得到11个不同的关闭的拉取请求(网站上大约有20个)。

是否有人知道这种差异的原因以及通过API获取仓库完整的拉取请求列表的方法?


你能再检查一下吗?我进行了一次测试,期望得到19,结果也是19。 - random
9个回答

40

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

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

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

如需更多信息,请查看参数表

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

  

"per_page = 30"为默认值。最大值为"per_page = 100"。 要获取超过100个结果,您需要多次调用它:"&page=1", "&page=2"...


如何从获取的结果中筛选出仅为拉取请求编号。 - Kasun Siyambalapitiya
1
我的问题是,如果我使用GET ?state=all,它会给出比?state=closed + ?state=open更小的数字。 - Akabelle
7
重要提示:默认每页显示30个结果,最大值为每页100个结果。如需获取超过100个结果,则需要多次调用API,并使用"&page=1"、"&page=2"等方式来获取更多结果。 - Tomas Votruba
1
我们如何知道是否有更多的页面?似乎没有任何响应属性。 - Yeikel
私有仓库怎么样? - m000
仅过滤特定的拉取请求编号怎么样? - 0004

16

11

使用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

查看更多详情和选项以及安装说明


4

有一种方法可以获得完整的列表,而你正在使用它。你使用什么来与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个拉取请求的存储库?也许可以通过不同的网络请求来实现? - shreyj
@shreyj,GitHub API 上的许多端点都是分页的,并且可以使用响应中的 Link headers 进行访问。如果您正在尝试使用 Python 或 Ruby 进行请求,我可以为您提供更多帮助。 - Ian Stapleton Cordasco

4

您还可以使用GraphQL API v4请求存储库的所有拉取请求。如果您未指定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


3
  1. 如果您想检索所有拉取请求 (提交、评论、问题等),您需要使用分页。 https://developer.github.com/v3/#pagination
  2. GET 请求 "pulls" 仅返回未关闭的拉取请求。
  3. 如果要获取所有拉取请求,可以将参数 state 设置为 all 或使用 issues。

额外信息

如果您需要从 Github 获取其他数据,例如问题,则可以从问题中识别拉取请求,然后检索每个拉取请求,无论它是关闭还是打开。它还会为您提供一些其他属性(可合并、已合并、合并提交 SHA、提交数等)。 如果问题是一个拉取请求,那么它将包含该属性。否则,它只是一个普通的问题。

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

"每个拉取请求都是一个问题,但不是每个问题都是拉取请求。因此,两个功能的“共享”操作,如操作指派人、标签和里程碑,都在 Issues API 中提供。"

编辑 我刚刚发现 issues 的行为与拉取请求类似,因此需要设置状态参数为 all 来检索所有请求。


1
请问您能提供获取所有拉取请求(状态为“all”)的代码吗? - Kasun Siyambalapitiya
抱歉打扰,我只是看到这是由@akshaynagpal提供的。 - Kasun Siyambalapitiya

1
这是一段Python代码片段,它检索特定GitHub存储库的所有拉取请求信息并将其解析为漂亮的DataFrame:
import pandas as pd

organization = 'pvlib'
repository = 'pvlib-python'
state = 'all'  # other options include 'closed' or 'open'

page = 1  # initialize page number to 1 (first page)
dfs = []  # create empty list to hold individual dataframes
# Note it is necessary to loop as each request retrieves maximum 30 entries
while True:
    url = f"https://api.github.com/repos/{organization}/{repository}/pulls?" \
        f"state={state}&page={page}"
    dfi = pd.read_json(url)
    if dfi.empty:
        break
    dfs.append(dfi)  # add dataframe to list of dataframes
    page += 1  # Advance onto the next page

df = pd.concat(dfs, axis='rows', ignore_index=True)

# Create a new column with usernames
df['username'] = pd.json_normalize(df['user'])['login']

1

1
GitHub提供了一个“Link”头,其中指定了先前、下一个和最后一个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”表示下一组值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接