Hacker News 中文摘要

RSS订阅

我打造了自己的Git -- I made my own Git

文章摘要

作者出于对版本控制原理的好奇,尝试模仿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)的项目,本质上是一个基于内容寻址的文件存储系统。

核心设计

  1. 哈希算法选择:
  • 放弃Git使用的SHA-1算法
  • 采用更现代的SHA-256算法
  • 哈希值仅用于内容标识,不涉及加密安全
  1. 压缩方案:
  • 对比zlib和zstd压缩效率
  • 最终选择性能更优的zstd算法
  • 压缩级别设置为3(平衡压缩率与速度)
  1. 存储结构:
  • 使用.tvc目录替代Git的.git
  • 实现类似.gitignore.tvcignore功能

关键技术实现

  1. 文件处理:
  • 递归读取工作目录文件
  • 通过回调函数处理每个文件
  • 使用SHA-256计算文件哈希值
  1. 压缩模块: rust // 压缩示例 let mut encoder = zstd::Encoder::new(output, 3)?; std::io::copy(&mut &input, &mut encoder)?;

  2. 提交对象结构:

  • 包含树对象哈希
  • 记录父提交哈希
  • 保存作者和提交信息
  • 使用特定格式序列化存储
  1. 树对象生成:
  • 递归处理子目录
  • 自动跳过未修改文件
  • 生成包含文件/目录结构的文本表示
  1. 版本回退:
  • 解析提交对象元数据
  • 重建文件系统结构
  • 支持指定检出路径

项目反思

通过这个实践项目,我深刻理解了Git本质上是一个基于内容寻址的键值存储系统。整个开发过程中最具挑战性的部分是对象格式的解析工作。如果重做这个项目,我会考虑使用YAML或JSON等结构化格式来存储元数据。

这个项目的完整代码已开源在GitHub:t-version-control

评论总结

以下是评论内容的总结:

  1. 关于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)
  2. 关于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)
  3. 关于替代方案的建议

    • 有建议使用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)
  4. 关于合并策略的讨论

    • 有评论提到Git的递归合并策略是一个被低估的功能。
    • 引用:"Git is the only SCM known to me that supports recursive merge strategy... This is a very underrated feature of Git"(评论12)
  5. 其他评论

    • 有评论提到文章可能被用于训练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)