【问题标题】:pyGithub Pull request invalid head (422 API error)pyGithub 拉取请求无效头部(422 API 错误)
【发布时间】:2020-09-05 21:19:46
【问题描述】:

最近我一直在尝试使用 pyGithub 在使用此代码段在一堆存储库中运行 make update 后创建一些自动化 PR。

body = 'Test PR 2 please ignore'
pr = repo.create_pull(title="Test PR please ignore",
                          body=body,
                          head="patch/helm-chart-update",
                          base="master")
pr

我一直从 API 收到此错误消息

github.GithubException.GithubException: 422 {"message": "Validation Failed", "errors": [{"resource": "PullRequest", "field": "head", "code": "invalid"}], "documentation_url": "https://developer.github.com/v3/pulls/#create-a-pull-request"}

当然,我的第一个猜测是我打错了 repo 名称,但事实并非如此。奇怪的是,当我用不存在的分支名称(如“someGarbage”)替换头部名称时,我得到了一个相同的错误。

接下来,我认为 PR 可能存在冲突或其他无效细节(尽管由于我正在使用的测试分支的简单性,这极不可能),但 Github GUI 创建 PR 时没有任何问题。

最终我能够使用 https://pypi.org/project/git-pull-request/ 进行 PR,但不幸的是,我看不到避免它在 shell 中打开 vim 的方法(由于这将运行的 repos 数量,这会产生很多麻烦在)。如果一切都失败了,我很可能只使用请求来手动调用 Github API,但我真的很想使用 pyGithub,既可以保持代码简单/可维护(因为我已经使用该库来搜索目标 repos 并将它们克隆到 /tmp) 并且因为它通常看起来是一个很好的工具,我想学习使用它。

抱歉,由于问题的性质,这不是最可重现的,但我很乐意详细说明细节。有什么想法吗?

更新

在使用requests 调用实现此功能后,感谢this post,如果您使用“params”参数进行调用以将json 对象而不是“json”参数传递给POST 请求,您得到相同的错误代码。开始怀疑一个错误,但我很想被证明是错误的

【问题讨论】:

  • 打开编辑器是为了什么?创建提交?合并提交?拉取请求描述?您可以在运行 git-pull-request 脚本之前尝试运行 export EDITOR=true 吗?

标签: python git github-api pygithub


【解决方案1】:

如果您收到此错误。您可能需要检查请求的参数。 例如: 我想通过 API 获取问题:repo.get_issues(state='close')。 实际上参数没有'close'值,正确的是'close'。正确的选项是'open'/'close'/'all'。

【讨论】:

    【解决方案2】:

    感谢 xjcl,我已经弄清楚了为什么我也遇到了这个问题,我有一点补充,我希望它可以为某人节省时间。

    问题是,您尝试为其发出拉取请求的 repo 可能当时并不存在

    我正在编写一个小型自动化工具,如果 repo 被修改,它会创建一个新分支,将其放入 GitHub 并发出拉取请求。问题是我在“git push”之后调用 GitHub API 太快了

    我通过询问 GitHub 是否存在分支来解决问题,并且仅在存在时才发出拉取请求:

    import time
    import os
    import requests
    ...
        os.popen(f"git push --set-upstream origin {branch_name}")
        os.popen("git checkout main")
        r = requests.get(f"{repo_url}/branches/{branch_name}", headers=headers)
        while r.status_code != 200:
            r = requests.get(f"{repo_url}/branches/{branch_name}", headers=headers)
            print(f'Repo not ready yet: {r.status_code}')
            time.sleep(1)
        payload = {"title": branch_name, "head": branch_name, "base": "main"}
        r = requests.post(f"{repo_url}/pulls", headers=headers,
                          data=json.dumps(payload))
    ...
    

    【讨论】:

      【解决方案3】:

      [{"resource": "PullRequest", "field": "head", "code": "invalid"}]

      错误消息试图传达名为“head”的字段/关键字包含无效数据。查看 GitHub 的 REST endpoint 文档:

      头部:必需。实施更改的分支的名称。对于同一网络中的跨存储库拉取请求,命名空间头部带有这样的用户:username:branch

      您当前设置它的方式 (head="patch/helm-chart-update", base="master") 它转到在线 GitHub 存储库,在那里查找分支 patch/helm-chart-update,并尝试准备合并到 master。请注意,如果该分支仅存在于本地(即您尚未完成 git push)或您在 GitHub 上创建了一个分支(在这种情况下,您需要按照说明在其前面加上您的用户名),这将不起作用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        • 2016-10-23
        • 1970-01-01
        • 2014-12-11
        • 2021-03-16
        • 1970-01-01
        相关资源
        最近更新 更多