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

【Git 内部】SHA-256 对象格式与 reftable 演进

文章导航

分类入口
opensource
标签入口
#git#git-internals#sha256#reftable#object-format

目录

三十年间 Git 对象 ID 一直是 SHA-1。碰撞攻击促使 Git 支持 SHA-256 对象格式;引用存储也在实验 reftable 以替代大量松散 ref 与 packed-refs。二者都改变「磁盘长什么样」,但截至 Git 2.54,默认仍是 SHA-1 + 松散/packed refs。


一、SHA-256 对象格式

创建仓库:

git init --object-format=sha256 sha256-demo

config 含:

[extensions]
    objectformat = sha256

对象 ID 为 64 十六进制字符;松散路径仍为前 2 字符目录 + 剩余 62 字符文件名,例如(Git 2.54.0 实测):

.git/objects/b6/1a639b8969bb23943c5f7dc89040350f213704e522fb4b2cbda6995f71617c

哈希算法换为 SHA-256,对象头与 zlib 布局不变(仍是 type size\0 + 载荷)。与 SHA-1 仓库不能直接混合对象;克隆、fetch 需双方支持相同 object format。

SHA-1 与 SHA-256 对象 ID 宽度及路径切分

托管平台与旧客户端支持不均——生产迁移前须核对工具链。实验失败时以 gitformat-hash 规范为准,不硬跑命令。


二、与 SHA-1 仓库的差异小结

项目 SHA-1(默认) SHA-256
ID 长度 40 hex 64 hex
路径 objects/ab/ + 38 objects/ab/ + 62
index/tree 内二进制 SHA 20 字节 32 字节
默认 init 需显式 flag

松散对象与 pack 的逻辑类型(blob/tree/commit/tag)不变,见 第 02、07 篇


三、reftable 是什么

reftable 把引用存进单个(或分片)二进制表文件,支持:

设计文档见 Git 源码 Documentation/technical/reftable.md(A 级来源路径)。与文本 refs/heads/* + packed-refs 并存期长:由 core.refFormat 等配置控制,默认仓库仍为传统布局第 04 篇)。

本文写「reftable 已全面替代 packed-refs」——应以当前版本的 git init 默认行为为准。

引用存储形态演进:loose refs、packed-refs、reftable

四、演进时间线(事实边界)

跟进新版本时,核对 Release Notesobjectformatreftable 段落。


五、选型建议(工程判断)


六、本文边界

复现 SHA-256:

git init --object-format=sha256 demo && cd demo
echo x > a.txt && git add a && git commit -m t
git rev-parse HEAD   # 64 字符
find .git/objects -type f

参考资料

系列索引Git 内部结构 · 上篇worktree/submodule

同主题继续阅读

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

2026-07-05 · opensource

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

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


By .