Den*_*SkS 18 python github github-api
我想创建一个存储库并通过任何Python包向它提交一些文件.我该怎么办?
我不明白如何添加提交文件.
小智 12
注意:我使用请求库来调用 GitHub REST API v3。
1. 获取特定分支的最后一次提交 SHA
# GET /repos/:owner/:repo/branches/:branch_name
last_commit_sha = response.json()['commit']['sha']
Run Code Online (Sandbox Code Playgroud)
2. 使用文件内容创建 blob(编码 base64 或 utf-8)
# POST /repos/:owner/:repo/git/blobs
# {
# "content": "aGVsbG8gd29ybGQK",
# "encoding": "base64"
#}
base64_blob_sha = response.json()['sha']
# POST /repos/:owner/:repo/git/blobs
# {
# "content": "hello world",
# "encoding": "utf-8"
#}
utf8_blob_sha = response.json()['sha']
Run Code Online (Sandbox Code Playgroud)
3. 创建一个定义文件夹结构的树
# POST repos/:owner/:repo/git/trees/
# {
# "base_tree": last_commit_sha,
# "tree": [
# {
# "path": "myfolder/base64file.txt",
# "mode": "100644",
# "type": "blob",
# "sha": base64_blob_sha
# },
# {
# "path": "file-utf8.txt",
# "mode": "100644",
# "type": "blob",
# "sha": utf8_blob_sha
# }
# ]
# }
tree_sha = response.json()['sha']
Run Code Online (Sandbox Code Playgroud)
4. 创建提交
# POST /repos/:owner/:repo/git/commits
# {
# "message": "Add new files at once programatically",
# "author": {
# "name": "Jan-Michael Vincent",
# "email": "JanQuadrantVincent16@rickandmorty.com"
# },
# "parents": [
# last_commit_sha
# ],
# "tree": tree_sha
# }
new_commit_sha = response.json()['sha']
Run Code Online (Sandbox Code Playgroud)
5. 更新分支的引用以指向新的提交 SHA(在 master 分支示例上)
# POST /repos/:owner/:repo/git/refs/heads/master
# {
# "ref": "refs/heads/master",
# "sha": new_commit_sha
# }
Run Code Online (Sandbox Code Playgroud)
最后,对于更高级的设置,请阅读docs。
这是完整的代码段:
def push_to_github(filename, repo, branch, token):
url="https://api.github.com/repos/"+repo+"/contents/"+filename
base64content=base64.b64encode(open(filename,"rb").read())
data = requests.get(url+'?ref='+branch, headers = {"Authorization": "token "+token}).json()
sha = data['sha']
if base64content.decode('utf-8')+"\n" != data['content']:
message = json.dumps({"message":"update",
"branch": branch,
"content": base64content.decode("utf-8") ,
"sha": sha
})
resp=requests.put(url, data = message, headers = {"Content-Type": "application/json", "Authorization": "token "+token})
print(resp)
else:
print("nothing to update")
token = "lskdlfszezeirzoherkzjehrkzjrzerzer"
filename="foo.txt"
repo = "you/test"
branch="master"
push_to_github(filename, repo, branch, token)
Run Code Online (Sandbox Code Playgroud)
Github提供了一个Git数据库API,使您可以访问读取和写入原始对象以及列出和更新引用(分支头和标记).为了更好地理解这个主题,我强烈建议你阅读Pro Git书中的Git Internals章节.
根据文档,将更改提交到存储库中的文件是一个7步骤的过程:
- 获取当前的提交对象
- 检索它指向的树
- 检索树对该特定文件路径具有的blob对象的内容
- 以某种方式更改内容并使用该新内容发布新的blob对象,然后返回blob SHA
- 发布一个新的树对象,该文件路径指针被替换为新的blob SHA,后面会返回树SHA
- 使用当前提交SHA作为父树和新树SHA创建一个新的提交对象,返回提交SHA
- 更新分支的引用以指向新的提交SHA
这篇博客在使用perl解释这个过程方面做得很好.对于python实现,您可以使用PyGithub库.