0. 总览
本文为大家提供一种使用 GitHub API 生成 Commit 的方法。通常我们会使用 Git 客户端 Commit 然后 Push 到 GitHub,但 GitHub 为我们提供了相关 API,可以直接通过 API 更新仓库。
要搞清楚整个更新流程,需要先理解 Git 的数据结构。如下图所示,Git 会使用 Ref、Commit、Tree、Blob 等单位管理 Commit 和文件。
所以要生成一个新的 Commit,需要从树状结构的叶到根按顺序生成,换句话说就是:Blob→Tree→Commit→Ref。
使用 GitHub API 提交文件有以下步骤。虽然对于第一次接触的新手来说可能会有点复杂,但是理清关系之后思路便会很清晰了。
- 获取 Ref:Ref 指 Git 的引用。如果要发起 Commit,必须知道你的 Commit 要提交到什么地方去(Commit 是一个接一个的链状关系,所以需要知道上一个 Commit 的信息),这一步做的就是这件事。
- 获取 Commit:用于获取当前 Commit 的 tree 的 sha。
- 生成 Blob:相当于正常本地提交的 add 操作。
- 生成 Tree:构建一个新的 tree。这里需要用到的参数 base_tree 就是来自第二步的 Commit 信息。
- 生成 Commit:提交你的 tree。至此已经完成提交。
- 更新 Ref:使 master 的指针指到你最新提交的版本。
注意:访问 POST 方法的接口必须带 token,虽然 GET 可以不带,但是会限制访问频率,所以建议都带上。相关文档:https://developer.github.com/v3/#authentication
1. 获取 Ref
1.1 文档地址
https://developer.github.com/v3/git/refs/#get-a-reference
1.2 请求地址
GET https://api.github.com/repos/ssshooter/test/git/refs/heads/master
1.3 返回数据
2. 获取 Commit
2.1 文档地址
https://developer.github.com/v3/git/commits/#get-a-commit
2.2 请求地址
GET https://api.github.com/repos/ssshooter/test/git/commits/cda66de943082033f4b761639df77728d7bca4f0
2.3 返回数据
3. 生成 Blob
3.1 文档地址
https://developer.github.com/v3/git/blobs/#create-a-blob
3.2 请求地址
POST https://api.github.com/repos/ssshooter/test/git/blobs
3.3 请求参数
3.4 返回数据
4. 生成 tree
4.1 文档地址
https://developer.github.com/v3/git/trees/#create-a-tree
4.2 请求地址
POST https://api.github.com/repos/ssshooter/test/git/trees
4.3 请求参数
注意:tree.path 可以写深层目录,如 deep/deep/newFile.md(前面不用写斜杠)
4.4 返回数据
5. 生成 Commit
5.1 文档地址
https://developer.github.com/v3/git/commits/#create-a-commit
5.2 请求地址
5.3 请求参数
5.4 返回数据
6. 更新 Ref
6.1 文档地址
https://developer.github.com/v3/git/refs/#update-a-reference
6.2 请求地址
https://api.github.com/repos/ssshooter/test/git/refs/heads/master
6.3 请求参数
6.4 返回数据
7. node.js 实践代码
参考文献