pyGithub Pull request invalid head (422 API 错误)
pyGithub Pull request invalid head (422 API error)
最近我一直在尝试使用 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"}
当然,我的第一个猜测是我输入了错误的存储库名称,但事实并非如此。奇怪的是,当我用 'someGarbage'.
等不存在的分支名称替换头名称时,我得到了一个相同的错误
接下来,我认为可能存在关于 PR 的冲突或其他无效细节(尽管由于我正在使用的测试分支的简单性,这极不可能),但是 Github GUI 创建了PR 没有任何问题。
最终我能够使用 https://pypi.org/project/git-pull-request/ 进行 PR,但不幸的是我看不到避免它在 shell 中打开 vim 的方法(这会创建一个由于回购的数量,这将 运行 带来很多麻烦)。如果一切都失败了,我可能只会使用请求来手动调用 Github API,但我真的很想使用 pyGithub,两者都保留代码simple/maintainable(因为我已经使用该库来搜索目标存储库并将它们克隆到 /tmp 中)并且因为它通常看起来是一个不错的工具,所以我想学习使用它。
抱歉,由于问题的性质,这不是最可重现的,但我很乐意详细说明细节。有什么想法吗?
更新
在使用 requests
调用实现此功能后,感谢 this post 我了解到,如果您使用 'params' 参数进行调用以将 json 对象传递给POST 请求而不是 'json' 参数,您会得到相同的错误代码。开始怀疑一个错误,但我很想被证明是错误的
[{"resource": "PullRequest", "field": "head", "code": "invalid"}]
错误消息试图表明名为 "head" 的 field/keyword 包含无效数据。查看 GitHub 的 REST endpoint 文档:
head: Required. The name of the branch where your changes are implemented. For cross-repository pull requests in the same network, namespace head with a user like this: username:branch
.
您当前设置它的方式 (head="patch/helm-chart-update", base="master"
) 它转到在线 GitHub 存储库,在那里寻找分支 patch/helm-chart-update
,并尝试准备合并到 master .请注意,如果该分支仅存在于本地(即您还没有完成 git push
)或者如果您在 GitHub 上创建了一个分支(在这种情况下,您需要在其前面加上您的用户名,如前所述)
感谢 xjcl,我已经弄清楚了为什么我也有这个问题,我有一点补充,我希望它能为别人节省时间。
问题是,也许您正尝试为其发出拉取请求的回购协议当时不存在。
我正在写一个小的自动化工具,如果 repo 被修改,它会创建一个新分支,将其放入 GitHub 并发出拉取请求。问题是我调用 GitHub API 太快了,就在“git push”之后
我通过询问 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))
...
如果您遇到此错误。您可能需要检查请求的参数。
例如:
我想通过 API 获取问题:repo.get_issues(state='close')。
实际上参数的值不是'close',正确的是'closed'。正确的选项是'open'/'closed'/'all'。
最近我一直在尝试使用 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"}
当然,我的第一个猜测是我输入了错误的存储库名称,但事实并非如此。奇怪的是,当我用 'someGarbage'.
等不存在的分支名称替换头名称时,我得到了一个相同的错误接下来,我认为可能存在关于 PR 的冲突或其他无效细节(尽管由于我正在使用的测试分支的简单性,这极不可能),但是 Github GUI 创建了PR 没有任何问题。
最终我能够使用 https://pypi.org/project/git-pull-request/ 进行 PR,但不幸的是我看不到避免它在 shell 中打开 vim 的方法(这会创建一个由于回购的数量,这将 运行 带来很多麻烦)。如果一切都失败了,我可能只会使用请求来手动调用 Github API,但我真的很想使用 pyGithub,两者都保留代码simple/maintainable(因为我已经使用该库来搜索目标存储库并将它们克隆到 /tmp 中)并且因为它通常看起来是一个不错的工具,所以我想学习使用它。
抱歉,由于问题的性质,这不是最可重现的,但我很乐意详细说明细节。有什么想法吗?
更新
在使用 requests
调用实现此功能后,感谢 this post 我了解到,如果您使用 'params' 参数进行调用以将 json 对象传递给POST 请求而不是 'json' 参数,您会得到相同的错误代码。开始怀疑一个错误,但我很想被证明是错误的
[{"resource": "PullRequest", "field": "head", "code": "invalid"}]
错误消息试图表明名为 "head" 的 field/keyword 包含无效数据。查看 GitHub 的 REST endpoint 文档:
head: Required. The name of the branch where your changes are implemented. For cross-repository pull requests in the same network, namespace head with a user like this:
username:branch
.
您当前设置它的方式 (head="patch/helm-chart-update", base="master"
) 它转到在线 GitHub 存储库,在那里寻找分支 patch/helm-chart-update
,并尝试准备合并到 master .请注意,如果该分支仅存在于本地(即您还没有完成 git push
)或者如果您在 GitHub 上创建了一个分支(在这种情况下,您需要在其前面加上您的用户名,如前所述)
感谢 xjcl,我已经弄清楚了为什么我也有这个问题,我有一点补充,我希望它能为别人节省时间。
问题是,也许您正尝试为其发出拉取请求的回购协议当时不存在。
我正在写一个小的自动化工具,如果 repo 被修改,它会创建一个新分支,将其放入 GitHub 并发出拉取请求。问题是我调用 GitHub API 太快了,就在“git push”之后
我通过询问 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))
...
如果您遇到此错误。您可能需要检查请求的参数。 例如: 我想通过 API 获取问题:repo.get_issues(state='close')。 实际上参数的值不是'close',正确的是'closed'。正确的选项是'open'/'closed'/'all'。