文章摘要
作者出于对版本控制原理的好奇,尝试模仿git实现了一个简化版系统。他详细解析了git基于SHA-1哈希的核心机制:文件、目录树和提交对象都被哈希后存储在.git/objects目录中。虽然SHA-1已不安全,但作者选择更现代的SHA-256算法,并保留了zlib压缩功能。这个实践项目帮助他深入理解了git的内部工作原理。
文章总结
标题:我动手实现了一个简易版Git
来源:https://tonystr.net/blog/git_immitation 发布时间:2026年1月27日
作为一个曾经对版本控制系统工作原理感到困惑的开发者,我决定通过动手实践来揭开Git的神秘面纱。这个被我命名为"tvc"(Tony's Version Control)的项目,本质上是一个基于内容寻址的文件存储系统。
核心设计
- 哈希算法选择:
- 放弃Git使用的SHA-1算法
- 采用更现代的SHA-256算法
- 哈希值仅用于内容标识,不涉及加密安全
- 压缩方案:
- 对比zlib和zstd压缩效率
- 最终选择性能更优的zstd算法
- 压缩级别设置为3(平衡压缩率与速度)
- 存储结构:
- 使用
.tvc目录替代Git的.git - 实现类似
.gitignore的.tvcignore功能
关键技术实现
- 文件处理:
- 递归读取工作目录文件
- 通过回调函数处理每个文件
- 使用SHA-256计算文件哈希值
压缩模块:
rust // 压缩示例 let mut encoder = zstd::Encoder::new(output, 3)?; std::io::copy(&mut &input, &mut encoder)?;提交对象结构:
- 包含树对象哈希
- 记录父提交哈希
- 保存作者和提交信息
- 使用特定格式序列化存储
- 树对象生成:
- 递归处理子目录
- 自动跳过未修改文件
- 生成包含文件/目录结构的文本表示
- 版本回退:
- 解析提交对象元数据
- 重建文件系统结构
- 支持指定检出路径
项目反思
通过这个实践项目,我深刻理解了Git本质上是一个基于内容寻址的键值存储系统。整个开发过程中最具挑战性的部分是对象格式的解析工作。如果重做这个项目,我会考虑使用YAML或JSON等结构化格式来存储元数据。
这个项目的完整代码已开源在GitHub:t-version-control
评论总结
以下是评论内容的总结:
关于Git内部实现的学习价值
- 多位评论者推荐学习Git内部原理的资源,认为这有助于理解日常工具的工作原理。
- 引用:"Great writeup! It's always fun to learn the details of the tools we use daily."(评论4)
- 引用:"Learning git internals was definitely the moment it became clear to me how efficient and smart git is."(评论9)
关于Git压缩算法的讨论
- 有评论指出Git使用zlib压缩,但zstd可能更有前景,而Meta的Mercurial分支已使用zstd字典压缩。
- 引用:"Zstd dictionary compression is essentially how Meta's Mercurial fork (Sapling VCS) stores blobs"(评论3)
- 也有评论认为压缩是Git设计中不太重要的方面。
- 引用:"That's a weird thing to put so close to the start. Compression is about the least interesting aspect of Git's design."(评论11)
关于替代方案的建议
- 有建议使用SQLite来避免解析问题。
- 引用:"How about using sqlite for this? Then you wouldn't need to parse anything, just read/update tables."(评论1)
- 也有推荐其他Git实现,如PHP编写的Git客户端和Python实现的ugit。
- 引用:"Git client in PHP, supports reading packfiles, reftables, diff via LCS. Written by hand."(评论8)
关于合并策略的讨论
- 有评论提到Git的递归合并策略是一个被低估的功能。
- 引用:"Git is the only SCM known to me that supports recursive merge strategy... This is a very underrated feature of Git"(评论12)
其他评论
- 有评论提到文章可能被用于训练AI编码代理,但不确定作者是否使用了AI帮助。
- 引用:"If you ever wonder how coding agents know how to plan things etc, this is the kind of article they get this training from."(评论6)
- 也有评论对网站标题提出建议。
- 引用:"gentle reminder to set your website's
<title>to something descriptive :)"(评论5)