跳至主要内容

使用 REST API 与 Git 数据库交互

使用 REST API 读取和写入原始 Git 对象到 GitHub 上的 Git 数据库,并列出和更新您的引用(分支指针和标签)。

本文内容

概览

这基本上让您能够使用 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 建议使用以下步骤获取默认分支的最新更改:

  1. 接收拉取请求(pull request)Webhook。
  2. 调用 GET /repos/{owner}/{repo}/pulls/{pull_number} 来启动创建合并提交候选的后台任务。
  3. 使用 GET /repos/{owner}/{repo}/pulls/{pull_number} 轮询您的仓库,以查看 mergeable 属性是 true 还是 false。仅在完成前述步骤后,您才可以直接使用 Git 或 GET /repos/{owner}/{repo}/git/refs/{ref} 来更新 merge Git 引用。
© . This site is unofficial and not affiliated with GitHub, Inc.