使用Requests API更新GitHub文件遇到的三类技术问题
使用GitHub REST API更新文件的问题解答
问题1:请求返回201,但代码推送到了main分支而非branch-1
你的代码存在两个关键错误:
- payload的JSON中
branch键后面多了空格,导致GitHub无法识别该参数,默认推送到仓库的默认分支(main) - 路径里的
?ref=branch-1是错误用法,GitHub API不需要在路径里加这个查询参数,分支信息应通过payload里的branch字段指定
修正方法:
把payload里的"branch ": "branch-1"改为"branch": "branch-1",同时将path改为纯文件名"test6.txt",移除多余的查询参数。
问题2:指定现有文件返回422状态码,如何更新现有文件?
更新GitHub上的现有文件必须提供该文件的sha值——这是文件当前版本的唯一标识,GitHub用它做冲突检测,确保你更新的是最新版本的文件。
操作步骤:
- 发送GET请求获取目标文件信息,请求路径为
https://api.github.com/repos/{owner}/{repo}/contents/{path}?ref=branch-1,从返回的JSON数据中提取sha字段 - 将
sha字段添加到payload中,格式示例:
{ "branch": "branch-1", "message": "my commit message", "committer": {"name":"Monalisa Octocat","email":"octocat@github.com"}, "content": "bXkgbmV3IGZpbGUgY29udGVudHM=", "sha": "获取到的文件sha值" }
问题3:该操作触发的事件是什么?如何通过GitHub工作流捕获?
通过API推送代码会触发push事件。
在GitHub工作流(.github/workflows/目录下的YAML文件)中,可以这样捕获该事件:
name: 监听API推送 on: push: branches: - branch-1 # 可指定只监听特定分支的push事件 jobs: build: runs-on: ubuntu-latest steps: - name: 执行任务 run: echo "检测到API推送的代码"
修正后的完整示例代码
import requests import json owner = "你的用户名" repo = "你的仓库名" token = "你的GitHub令牌" path = "test6.txt" branch = "branch-1" # 获取现有文件的sha(更新文件时必须) get_url = f"https://api.github.com/repos/{owner}/{repo}/contents/{path}?ref={branch}" get_response = requests.get( get_url, headers={'authorization': f'Bearer {token}'} ) file_sha = get_response.json()['sha'] # 构造正确的payload payload = { "branch": branch, "message": "my commit message", "committer": {"name": "Monalisa Octocat", "email": "octocat@github.com"}, "content": "bXkgbmV3IGZpbGUgY29udGVudHM=", "sha": file_sha } put_url = f"https://api.github.com/repos/{owner}/{repo}/contents/{path}" r = requests.put( put_url, headers={ 'accept': 'application/vnd.github.v3+json', 'authorization': f'Bearer {token}' }, data=json.dumps(payload) ) print(r.status_code) print(r.json())
内容的提问来源于stack exchange,提问作者Karki
相关产品推荐
相关产品推荐

