土法炼钢兴趣小组的算法知识备份

Git 内部结构 — 系列规划

目录

Git 内部结构 — 系列规划

本文是写作规划,不是可发布正文。拆解对象是 Git 对象库的磁盘文件格式命令/协议如何落地为文件;写法为格式规范级(官方 gitformat-* + 本地实测),不做 git/git C 函数级长拆。

关联文档: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 命令(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 initfind .git -type f 已跑
02 zlib decompress 松散对象;git hash-object 已跑
03 git cat-file -p 展开 commit/tree 已跑
04 git pack-refs --allpacked-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 addgitdir: 指针 已跑
16 git init --object-format=sha256 已跑

复现脚本目录:reproduce/(各篇 reproduce.sh 或共用 common.sh)。


六、图示计划

全系列 28 张 SVG,reproduce/generate_figures.py 生成(图内英文标签)
01 git-dir-tree.svgthree-trees-flow.svg
08 repack-size-bars.svg(临时仓库实测)

运行:.gpuvenv/bin/python post/git-internals/reproduce/generate_figures.py

配色与图内文字规范见 WRITING_GUIDE.md 第十节。


七、写作顺序

  1. index.md(已完成)
  2. 第 01 篇(全景)
  3. 第 02 → 03 → 04 → 06
  4. 第 07 → 08 → 09
  5. 第 10 → 11
  6. 第 12 → 13 → 14
  7. 第 05、15、16
  8. 更新 post/series/index.md

八、已确认决策(2026-07-05)

  1. 深度:格式规范级,源码仅边界说明。
  2. 规模:16 篇,不扩 wire-protocol 独立成章以外内容。
  3. SHA-256:第 16 篇;实验支持则展示 64 字符 ID。
  4. reftable:设计文档 + 边界,不写已默认启用。
  5. 性能:bitmap/commit-graph 不写未实测倍率。

九、风险与边界


规划版本:v1,2026-07-05 目录:post/git-internals/

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-07-05 · opensource

【Git 内部】Git 内部结构:对象库与磁盘文件格式

从 .git 目录布局、松散对象与 packfile 格式,到 refs、index、reflog、gc/fsck 与 fetch/push 落地——用官方 format 文档与本地实测 dump 系统讲清 Git 把版本历史存在哪、每个命令改写了哪些文件。全 16 篇。


By .