Skip to main content

使用 REST API 与 Git 数据库交互

使用 REST API,可在 GitHub 上的 Git 数据库中读取和写入原始 Git 对象,并列出和更新你的引用(分支头部和标记)。

在本文中

概述

这基本上允许你通过 REST API 重新实现大量 Git 功能 - 通过直接在数据库中创建原始对象并更新分支引用,从技术上讲,可以在不安装 Git 的情况下完成 Git 能做的任何事情。

如果 Git 存储库为空或不可用,REST API 将返回 409 Conflict。 存储库不可用通常意味着 GitHub 正在创建存储库。 对于空存储库,可以使用 PUT /repos/{owner}/{repo}/contents/{path} REST API 终结点来创建内容并初始化存储库,以便可以使用 API 来管理 Git 数据库。 如果此响应状态仍然存在,请联系 。

有关 Git 对象数据库的详细信息,请阅读 Pro Git 手册中的 Git 内部章节。

例如,如果要将更改提交到存储库中的某个文件,需要:

  • 获取当前提交对象
  • 检索它指向的树
  • 检索树中与该特定文件路径对应的 blob 对象的内容
  • 以某种方式更改内容并发布包含这些新内容的新 blob 对象,以获取 blob SHA
  • 发布新的树对象, 将文件路径指针替换为新的 blob SHA, 以获取树 SHA
  • 通过作为父级的当前提交 SHA 和新的树 SHA,创建新的提交对象,以获取提交 SHA
  • 更新分支的引用以指向新的提交 SHA

看似很复杂,但是当了解模型后,实际上很简单,它将带来崭新的体验,使你可以使用 API 实现许多功能。

检查拉取请求的可合并性

警告

请不要依赖于直接使用 Git 或 GET /repos/{owner}/{repo}/git/refs/{ref} 来更新 merge Git 引用,因为此内容会在没有警告的情况下过时。

使用 API 需要明确请求拉取请求来创建一个_测试_合并提交。 在 UI 中查看拉取请求并显示“合并”按钮时,或者使用 REST API 获取创建编辑拉取请求时,将创建一个测试合并提交。 如果没有此请求,merge Git 引用将过期,直到有人查看拉取请求。

如果当前使用的是生成过时merge Git refs 的轮询方法,则GitHub建议使用以下步骤从默认分支获取最新更改:

  1. 接收拉取请求 web 挂钩。
  2. 调用 GET /repos/{owner}/{repo}/pulls/{pull_number} 来启动创建合并提交候选的后台任务。
  3. 使用 GET /repos/{owner}/{repo}/pulls/{pull_number} 轮询存储库以查看是否 mergeable 属性为 truefalse。 只有在执行上述步骤后,才能直接使用 Git 或 GET /repos/{owner}/{repo}/git/refs/{ref} 更新 merge Git 引用。