概览
这基本上让您能够使用 REST API 重新实现大量 Git 功能——通过直接在数据库中创建原始对象并更新分支引用,您在技术上可以完成几乎所有 Git 能做的事情,而无需安装 Git 本身。
如果 Git 仓库为空或不可用,REST API 将返回 409 Conflict。不可用的仓库通常表示 GitHub 正在创建该仓库。对于空仓库,您可以使用 PUT /repos/{owner}/{repo}/contents/{path} REST API 端点来创建内容并初始化仓库,从而可以使用 API 管理 Git 数据库。如果此响应状态持续出现,请通过 GitHub 支持门户与我们联系。
有关 Git 对象数据库的更多信息,请阅读 Pro Git 书籍中的 Git Internals章节。
例如,如果您想对仓库中的文件提交更改,您需要
- 获取当前的提交对象
- 检索它指向的树对象
- 获取该树中对应文件路径的 blob 对象内容
- 以某种方式更改内容并发布一个包含新内容的 blob 对象,获取 blob SHA
- 发布一个新的树对象,将该文件路径指针替换为新的 blob SHA,获取树 SHA
- 创建一个新的提交对象,以当前提交 SHA 作为父节点,新的树 SHA 作为树,获取提交 SHA
- 更新分支的引用,使其指向新的提交 SHA
这看起来可能很复杂,但当您了解模型后其实相当简单,并且它会打开许多您可以通过 API 实现的可能性。
检查拉取请求的可合并性
警告
请不要直接依赖使用 Git 或 GET /repos/{owner}/{repo}/git/refs/{ref} 来更新 merge Git 引用,因为这些内容会在未发出警告的情况下变得过时。
消费端 API 必须显式请求拉取请求以创建一个 测试 合并提交。当您在 UI 中查看拉取请求并显示 “Merge” 按钮时,或在使用 REST API 获取、创建或 编辑 拉取请求时,会创建一个 测试 合并提交。如果未进行此请求,merge Git 引用将在下次有人查看拉取请求之前保持过期状态。
如果您当前使用的轮询方式会产生过时的 merge Git 引用,GitHub 建议使用以下步骤获取默认分支的最新更改:
- 接收拉取请求(pull request)Webhook。
- 调用
GET /repos/{owner}/{repo}/pulls/{pull_number}来启动创建合并提交候选的后台任务。 - 使用
GET /repos/{owner}/{repo}/pulls/{pull_number}轮询您的仓库,以查看mergeable属性是true还是false。仅在完成前述步骤后,您才可以直接使用 Git 或GET /repos/{owner}/{repo}/git/refs/{ref}来更新mergeGit 引用。