Git bundle 是一种用于离线传输 Git 对象的机制,它允许用户在没有活动服务器连接的情况下,将 Git 仓库的内容打包成一个文件。这对于在网络受限的环境下(例如,通过 U 盘、邮件等方式)传输版本库的快照或历史记录非常有用。
**核心功能与用途**
* **离线传输**:Bundle 文件本质上是 Git 对象(如提交、树等)的归档,可以作为整个仓库的备份,也可以用于将一个仓库的状态传递给另一个仓库。
* **备份**:用户可以使用 `git bundle create` 命令来创建仓库的完整备份。通过指定 `--all` 选项,可以包含所有引用(refs)可达的提交。这可以用于将整个仓库的快照转移到另一台机器。
* **增量更新**:当需要更新已存在的仓库时,可以创建包含自上次同步以来新增提交的增量包。这通常通过指定一个范围(例如 `lastR2bundle..master`)来实现,其中 `lastR2bundle` 是上次同步的标记点。
* **克隆与拉取**:接收方机器可以通过 `git clone <bundle_file>` 来从这个 bundle 文件克隆出一个新的仓库。如果目标仓库已经存在,也可以使用 `git fetch` 或 `git pull` 从 bundle 文件进行更新。
**使用流程概述**
1. **创建(发送方)**:在源仓库(R1)上,执行 `git bundle create <bundle_file> <git-rev-list-args>`。`<git-rev-list-args>` 用于指定要包含哪些提交或引用范围。如果需要包含所有内容,可以使用 `--all`。
2. **传输**:将生成的 `.bundle` 文件通过物理介质或非网络方式传输到目标机器(B)。
3. **接收与恢复(接收方)**:在目标机器(R2)上,可以使用 `git clone <bundle_file>` 来初始化一个新仓库,或者使用 `git fetch` / `git pull` 来更新现有仓库。
**关键命令说明**
* `git bundle create`: 用于创建 bundle 文件。它需要指定输出文件名和定义内容所需的引用列表参数。
* `git bundle verify`: 用于检查一个已有的 bundle 文件是否有效,以及当前本地仓库是否具备解包所需的先决条件提交。
* `git bundle list-heads`: 用于列出 bundle 文件中包含的引用。
* `git bundle unbundle`: 将 bundle 中的对象传递给 `git index-pack` 进行存储。
**注意事项**
* **局限性**:Bundle 文件主要用于传输**引用(refs)和提交(commits)**的历史记录。它不会备份本地工作区的内容、暂存区(index)、stash、或仓库的配置文件等本地状态。
* **写入限制**:目前不支持将数据“推入”(push)一个 bundle 文件,它主要是一个只读的归档格式。
* **自包含性**:如果创建的 bundle 包含足够的信息(例如,只指定一个新提交 `new`),它理论上可以被解包到任何没有共同历史的仓库中,实现完全自包含的历史恢复。
通过理解这些步骤和命令,开发团队可以在没有网络连接的情况下,安全、完整地将版本库的历史和状态传递给其他开发环境或机器。