Gitlab bundle 格式介绍

发布时间: 更新时间: 总字数:1007 阅读时间:3m 作者:IP:上海 网址

在 GitLab 的备份文件(那个巨大的 .tar 包)中,如果你将其解压,会在 repositories/ 目录下看到大量以 .bundle 结尾的文件。简单来说,.bundle 文件就是你的 Git 代码仓库的“单文件压缩包”。它是 Git 官方提供的一种标准离线打包格式。

.bundle 文件里到底装了什么?

每一个 .bundle 文件对应着 GitLab 中的一个代码仓库(或者 Wiki 仓库、设计仓库)。它包含了该仓库所有的 Git 数据

  • 所有的代码文件和历史版本
  • 所有的提交记录(Commits)
  • 所有的分支(Branches)
  • 所有的标签(Tags)

⚠️ 注意它不包含的内容: .bundle 纯粹是底层的 Git 数据。它不包含 GitLab 平台上的业务数据,比如:Issues(工单)、Merge Requests(合并请求的评论)、CI/CD 变量、用户权限等。这些业务数据全部保存在同级的数据库备份文件(database.sql.gz)中。

为什么 GitLab 备份要用 .bundle 格式?

GitLab 在执行 gitlab:backup:create 时,并没有简单粗暴地去复制 /var/opt/gitlab/git-data/ 下的文件,而是针对每一个项目悄悄执行了 git bundle create 命令。这样做有三大优势:

  • 数据一致性与安全性:如果是普通的文件复制,在复制过程中如果有人刚好 push 了代码,会导致备份出来的仓库损坏。git bundle 是 Git 原生命令,能够安全地生成某个瞬间的完整快照,保证仓库绝对不会损坏。
  • 极致的压缩率.bundle 采用 Git 内部的 Delta 压缩算法,通常比直接打包(tarzip.git 文件夹的体积要小得多。
  • 标准的通用格式.bundle 是标准的 Git 文件。这意味着,即使你的 GitLab 服务器彻底宕机且无法修复,只要你手里有这个 .bundle 文件,你依然可以随时把代码提取出来!

如何脱离 GitLab,手动提取 .bundle 里的代码?

这是 .bundle 文件最强大的地方。如果你急需某段代码,但 GitLab 还没搭建好,你可以直接在本地把 .bundle 当作一个远程仓库来操作。

假设你从备份中解压出了一个名叫 project.bundle 的文件,把它拷贝到你的个人电脑上,你可以执行以下操作:

验证包是否完整:

bash
git bundle verify project.bundle

直接克隆出代码(就像从线上 clone 一样):

bash
# 这会把 bundle 里的代码解压到一个叫 my_code 的文件夹里
git clone project.bundle my_code

查看里面有哪些分支:

bash
git ls-remote project.bundle

它们在 GitLab 备份包里的结构

在现代 GitLab(包括 11.2 以后采用 Hashed Storage 哈希存储的版本)中,.bundle 文件的路径通常看起来像一堆乱码,例如: repositories/@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.bundle

这是因为 GitLab 为了防止项目重命名导致文件夹移动,使用了项目 ID 的哈希值来作为存储路径。

  • .bundle 结尾的是你的主项目代码
  • .wiki.bundle 结尾的是该项目的 Wiki 文档库

总结

.bundle 文件就是 GitLab 为你的每一个项目生成的标准 Git 离线镜像包。它是你在面对灾难恢复时,确保核心代码(源码本身)绝对不丢失的最后一道底线。

本文总阅读量 次 本站总访问量 次 本站总访客数