【Git 内部】.git 目录全景:三棵树与仓库布局
git init 之后 .git 里每个路径干什么?对照 gitrepository-layout 与本地 find 清单,建立 bare/non-bare、三棵树、objects/refs/index 的磁盘级地图。
发布来自土法炼钢兴趣小组的知识、笔记、进展和应用。主题包括数据结构和算法、编程语言、网络安全、密码学等。
共 17 篇文章 · 返回首页
git init 之后 .git 里每个路径干什么?对照 gitrepository-layout 与本地 find 清单,建立 bare/non-bare、三棵树、objects/refs/index 的磁盘级地图。
blob/tree/commit 在磁盘上如何编码?对象头 type size、zlib 压缩、objects/ab/cdef 路径命名,对照 git hash-object 与手工 SHA-1 验证。
一次提交在对象库里如何连成链?tree 条目 mode/name/hash、commit 的 tree/parent 字段、annotated tag,用 git cat-file -p 展开并画对象图。
分支和标签在磁盘上只是一行 SHA?refs/heads、符号引用 HEAD、packed-refs 文件头与 peeled tag 的格式与生成时机。
git reflog 读的是哪个文件?logs/HEAD 与 logs/refs 的二进制条目格式:旧 SHA、新 SHA、提交者、时间戳与消息。
git add 改的是 .git/index。dircache 魔数、条目 stat/SHA/stage、TREE/REUC 扩展节,对照 xxd 与 git ls-files -s。
git repack 之后的 .pack 与 .idx 各存什么?PACK 头、对象类型字节、OFS_DELTA/REF_DELTA,对照 git verify-pack -v 读格式。
相似 blob 如何变成 REF_DELTA 链?pack-objects 窗口、thin pack 与 git verify-pack 里的 chain length,用 20 个近邻文件实测。
objects/info/commit-graph 与 pack-*.bitmap 各加速什么?generation number 与 rev-list 可达性遍历的磁盘侧辅助结构。
git gc 触发了什么?gc.log、info/packs、松散对象 prune 与 git count-objects -v 各字段,对照 gc 前后文件树。
git fsck 检查什么?故意截断松散对象 zlib 后的报错、dangling 与 corrupt 的区别,以及修复边界。
add、commit、branch、checkout、reset 各触及 .git 的哪些路径?用分步 find 快照对照 index、objects、refs、logs 的变化。
MERGE_HEAD、ORIG_HEAD、CHERRY_PICK_HEAD 何时出现?冲突时 index stage 1/2/3 与 git ls-files -u 的磁盘对应。
fetch 接收的 pack 如何写入 objects/pack?FETCH_HEAD、refs/remotes、shallow 文件与浅克隆的磁盘痕迹。
多工作树 .git 是文件不是目录?worktrees/、gitdir 指针、.git/modules 子模块对象库与 info/alternates 共享。
git init --object-format=sha256 后对象 ID 与路径有何变化?reftable 相对 packed-refs 的设计定位与当前默认边界。
从 .git 目录布局、松散对象与 packfile 格式,到 refs、index、reflog、gc/fsck 与 fetch/push 落地——用官方 format 文档与本地实测 dump 系统讲清 Git 把版本历史存在哪、每个命令改写了哪些文件。全 16 篇。