Git 内部结构 — 系列规划
本文是写作规划,不是可发布正文。拆解对象是 Git 对象库的磁盘文件格式与命令/协议如何落地为文件;写法为格式规范级(官方
gitformat-*+ 本地实测),不做git/gitC 函数级长拆。关联文档:
index.md(读者入口)。本文件聚焦逐章大纲、来源台账、实验台账与写作顺序。版本锚定:Git 2.45+ 主线;本站实验 Git 2.54.0,WSL2 Linux。
一、为什么写这个系列
1.1 知识栈缺口
| 已有内容 | 视角 | 缺口 |
|---|---|---|
| Pro Git / 命令教程 | porcelain 用法 | 少逐字节 format |
post/storage/ 小文件篇 |
文件系统 | 未落到 .git/objects |
post/opensource/ |
协作与许可证 | 未拆对象库 |
结论:工程师会用 Git,但 clone 后
.git 里几十种路径、pack delta、reflog
二进制布局缺少一份可核对的中文系统资料。
1.2 系列定位
Git 对象库 = 松散/pack 对象 + refs + index + reflog + 维护元数据
不写:命令大全、托管平台内部、.gitignore
语法百科、HTTP 服务器路由实现。
写:磁盘布局、format 规范、命令触发的文件 diff、fetch 接收 pack 的落盘路径、SHA-256/reftable 边界。
二、核心问题与目标读者
2.1 五个关键问题
见 index.md 第一节(与规划附件一致)。
2.2 目标读者
- 写 Git 工具、备份/审计脚本、对象库直连工具的工程师
- 排查「仓库损坏」「空间暴涨」「reflog 丢了」的 SRE
- 已会用 Git、想建立磁盘级心智模型的后端开发者
先修:基本 Git 命令(init/add/commit/branch/merge/fetch)。不假设读过 Git 源码。
三、篇目结构(全 16 篇)
详见 index.md 第三节。依赖图见
index.md Mermaid。
四、来源台账(A 级为主)
| 文档 | 用途 | 章节 |
|---|---|---|
| gitrepository-layout | .git 目录约定 |
01, 15 |
| Git man page gitformat-pack | pack/idx | 07, 08, 14 |
| Git man page gitformat-index | dircache | 06, 13 |
| Git man page gitformat-commit-graph | commit-graph | 09 |
| Git man page gitprotocol-pack | pack 传输 | 14 |
| Pro Git Ch.10 Git Internals | 全景辅助(B 级) | 全系列 |
git/git tag v2.45.0+
Documentation/technical/ |
边界核对 | 按需 |
五、实验台账
统一环境:WSL2,Git 2.54.0,临时目录
mktemp -d,不提交密钥。
| 篇 | 实验 | 状态 |
|---|---|---|
| 01 | git init →
find .git -type f |
已跑 |
| 02 | zlib decompress
松散对象;git hash-object |
已跑 |
| 03 | git cat-file -p 展开 commit/tree |
已跑 |
| 04 | git pack-refs --all →
packed-refs |
已跑 |
| 05 | hexdump -C .git/logs/HEAD |
已跑 |
| 06 | xxd .git/index 头部 |
已跑 |
| 07 | git repack -ad +
verify-pack -v |
已跑 |
| 08 | 20 个相似 blob 两次 commit → delta 链 | 已跑 |
| 09 | git commit-graph write |
已跑 |
| 10 | git gc --prune=now +
count-objects -v |
已跑 |
| 11 | truncate 松散对象 → git fsck |
已跑 |
| 12 | 分步快照 .git 文件 mtime |
写作时跑 |
| 13 | 制造 merge 冲突 → ls-files -u |
已跑 |
| 14 | git clone --bare + --depth 1
shallow |
已跑 |
| 15 | git worktree add → gitdir:
指针 |
已跑 |
| 16 | git init --object-format=sha256 |
已跑 |
复现脚本目录:reproduce/(各篇
reproduce.sh 或共用
common.sh)。
六、图示计划
| 篇 | 图 |
|---|---|
| 全系列 | 28 张 SVG,reproduce/generate_figures.py
生成(图内英文标签) |
| 01 | git-dir-tree.svg、three-trees-flow.svg |
| 08 | repack-size-bars.svg(临时仓库实测) |
运行:.gpuvenv/bin/python post/git-internals/reproduce/generate_figures.py
配色与图内文字规范见 WRITING_GUIDE.md
第十节。
七、写作顺序
(已完成)index.md- 第 01 篇(全景)
- 第 02 → 03 → 04 → 06
- 第 07 → 08 → 09
- 第 10 → 11
- 第 12 → 13 → 14
- 第 05、15、16
- 更新
post/series/index.md
八、已确认决策(2026-07-05)
- 深度:格式规范级,源码仅边界说明。
- 规模:16 篇,不扩 wire-protocol 独立成章以外内容。
- SHA-256:第 16 篇;实验支持则展示 64 字符 ID。
- reftable:设计文档 + 边界,不写已默认启用。
- 性能:bitmap/commit-graph 不写未实测倍率。
九、风险与边界
- SHA-256 仓库:托管/旧工具链可能不兼容,实验失败则只写规范。
- 对象文件只读:
chmod u+w后再做 fsck 损坏实验。 - 第 14 篇:pack 落盘为主,不展开 HTTP smart 路由。
规划版本:v1,2026-07-05
目录:post/git-internals/
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【Git 内部】Git 内部结构:对象库与磁盘文件格式
从 .git 目录布局、松散对象与 packfile 格式,到 refs、index、reflog、gc/fsck 与 fetch/push 落地——用官方 format 文档与本地实测 dump 系统讲清 Git 把版本历史存在哪、每个命令改写了哪些文件。全 16 篇。