如何使用GitHub API v3创建提交并推送到repo?

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

  • 这些只是 HTTP 请求/响应包。它并没有真正解释如何做到这一点或它们的含义。 (2认同)

Von*_*onC 11

您可以查看新更新GitHub CRUD API(2013年5月)是否有帮助

资料库的内容API已经允许读取文件一会儿.现在,您可以轻松地将更改提交到单个文件,就像在Web UI中一样.

从今天开始,您可以使用以下方法:


Mar*_*rus 7

这是完整的代码段:

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)


Jai*_*dya 6

Github提供了一个Git数据库API,使您可以访问读取和写入原始对象以及列出和更新引用(分支头和标记).为了更好地理解这个主题,我强烈建议你阅读Pro Git书中的Git Internals章节.

根据文档,将更改提交到存储库中的文件是一个7步骤的过程:

  1. 获取当前的提交对象
  2. 检索它指向的树
  3. 检索树对该特定文件路径具有的blob对象的内容
  4. 以某种方式更改内容并使用该新内容发布新的blob对象,然后返回blob SHA
  5. 发布一个新的树对象,该文件路径指针被替换为新的blob SHA,后面会返回树SHA
  6. 使用当前提交SHA作为父树和新树SHA创建一个新的提交对象,返回提交SHA
  7. 更新分支的引用以指向新的提交SHA

这篇博客在使用perl解释这个过程方面做得很好.对于python实现,您可以使用PyGithub库.