把 Git 放到 S3 上,现在所有人都做错了
来源:enroute.sh — 2026-10-13
📋 概述
Enroute 团队复盘了当前主流的「S3 + 预写日志」式 Git 托管:从 Cursor/SpaceX 八月公布的 Continuity 起,出现大量照抄同一思路的开源实现。它们确实把可扩展性与持久性交给了对象存储,但有两处不足——读扩展得不错却在写密集时吃力,而且仍然依赖会在磁盘上做内存映射的 Git CLI,因此每个仓库必须先完整落到磁盘才能开始服务。文章的根因分析是:Git 不只是内容寻址存储,还是一个图数据库,查询要从 ref 走到 commit、tree、blob,还要跟随 delta 链,如果按对象逐个取,每一步都是 30~40 毫秒的往返,所以关键在保持数据局部性。Enroute 的方案是计算与存储分离:每个仓库跑一条 MultiRaft 复制日志,负责 ref 更新与层级清单;推送的大部分工作在提交之前就并行完成,只有提交经比较交换按序应用;摄取时重写 packfile 以约束对象图的连通性。他们称在单仓库上跑出了超过 7,600 次并发推送/秒的持续峰值。
🔑 核心要点
- 现有 S3+WAL 方案的两个短板:写密集时吃力,且仍依赖会在磁盘做内存映射的 Git CLI,仓库必须先完整落地才能服务
- 根因是 Git 不只是内容寻址存储,还是一个图数据库,取数要逐层跟随 commit、tree、blob 与 delta 链
- 若按对象逐个取,每一步都是 30~40 毫秒的往返,所以关键是保持数据局部性
- Enroute 用 每个仓库一条 MultiRaft 复制日志管理 ref 更新与层级清单,计算节点完全无状态、只留缓存
- 推送的大部分工作在提交之前并行完成,只有提交经比较交换按序应用,不同分支的推送互不冲突,读快照不会被写饿死
- 摄取时重写 packfile 约束对象图连通性;官方称单仓库持续峰值超过 7,600 次并发推送/秒,浅克隆比原生 git 快两倍以上
💡 金句
如果 Git 是按现代数据库的思路设计的,而不是磁盘上的一个文件,它会是什么样子?
👍 0
👎 0
← 返回 Lobsters 首页