{"meta":{"title":"使用 REST API 与 Git 数据库交互","intro":"使用 REST API，可在 GitHub 上的 Git 数据库中读取和写入原始 Git 对象，并列出和更新你的引用（分支头部和标记）。","product":"REST API","breadcrumbs":[{"href":"/zh/enterprise-server@3.22/rest","title":"REST API"},{"href":"/zh/enterprise-server@3.22/rest/guides","title":"指南"},{"href":"/zh/enterprise-server@3.22/rest/guides/using-the-rest-api-to-interact-with-your-git-database","title":"入门 - Git 数据库"}],"documentType":"article"},"body":"# 使用 REST API 与 Git 数据库交互\n\n使用 REST API，可在 GitHub 上的 Git 数据库中读取和写入原始 Git 对象，并列出和更新你的引用（分支头部和标记）。\n\n## 概述\n\n这基本上允许你通过 REST API 重新实现大量 Git 功能 - 通过直接在数据库中创建原始对象并更新分支引用，从技术上讲，可以在不安装 Git 的情况下完成 Git 能做的任何事情。\n\n如果 Git 存储库为空或不可用，REST API 将返回 `409 Conflict`。 存储库不可用通常意味着 GitHub 正在创建存储库。 对于空存储库，可以使用 [`PUT /repos/{owner}/{repo}/contents/{path}`](/zh/enterprise-server@3.22/rest/repos/contents#create-or-update-file-contents) REST API 终结点来创建内容并初始化存储库，以便可以使用 API 来管理 Git 数据库。 如果此响应状态仍然存在，请联系 。\n\n有关 Git 对象数据库的详细信息，请阅读 Pro Git 手册中的 [Git 内部](https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain)章节。\n\n例如，如果要将更改提交到存储库中的某个文件，需要：\n\n* 获取当前提交对象\n* 检索它指向的树\n* 检索树中与该特定文件路径对应的 blob 对象的内容\n* 以某种方式更改内容并发布包含这些新内容的新 blob 对象，以获取 blob SHA\n* 发布新的树对象， 将文件路径指针替换为新的 blob SHA， 以获取树 SHA\n* 通过作为父级的当前提交 SHA 和新的树 SHA，创建新的提交对象，以获取提交 SHA\n* 更新分支的引用以指向新的提交 SHA\n\n看似很复杂，但是当了解模型后，实际上很简单，它将带来崭新的体验，使你可以使用 API 实现许多功能。\n\n## 检查拉取请求的可合并性\n\n> \\[!WARNING]\n> 请不要依赖于直接使用 Git 或 [`GET /repos/{owner}/{repo}/git/refs/{ref}`](/zh/enterprise-server@3.22/rest/git/refs#get-a-reference) 来更新 `merge` Git 引用，因为此内容会在没有警告的情况下过时。\n\n使用 API 需要明确请求拉取请求来创建一个\\_测试\\_合并提交。 在 UI 中查看拉取请求并显示“合并”按钮时，或者使用 REST API *获取*、[创建](/zh/enterprise-server@3.22/rest/pulls/pulls#get-a-pull-request)或[编辑](/zh/enterprise-server@3.22/rest/pulls/pulls#create-a-pull-request)拉取请求时，将创建一个[测试](/zh/enterprise-server@3.22/rest/pulls#update-a-pull-request)合并提交。 如果没有此请求，`merge` Git 引用将过期，直到有人查看拉取请求。\n\n如果当前使用的是生成过时`merge` Git refs 的轮询方法，则GitHub建议使用以下步骤从默认分支获取最新更改：\n\n1. 接收拉取请求 web 挂钩。\n2. 调用 [`GET /repos/{owner}/{repo}/pulls/{pull_number}`](/zh/enterprise-server@3.22/rest/pulls/pulls#get-a-pull-request) 来启动创建合并提交候选的后台任务。\n3. 使用 [`GET /repos/{owner}/{repo}/pulls/{pull_number}`](/zh/enterprise-server@3.22/rest/pulls/pulls#get-a-pull-request) 轮询存储库以查看是否 `mergeable` 属性为 `true` 或 `false`。 只有在执行上述步骤后，才能直接使用 Git 或 [`GET /repos/{owner}/{repo}/git/refs/{ref}`](/zh/enterprise-server@3.22/rest/git/refs#get-a-reference) 更新 `merge` Git 引用。"}