agent 撑爆 Git 之后,两家改的不是同一层

摘要:OpenAI 把中位推送延迟压到原来的五分之一,代价是仓库不再有一个统一时间点;Anthropic 干脆换掉了 Git,换来的是取消合并队列的全局锁。同一个症状,两家给出了相反的诊断。

下午四点,你在等 CI。三个分支挂着,push 上去要等十几秒,fetch 卡在 resolving deltas 上转圈。

你骂了一句:Git 真慢。

把这个量级放大到几千倍,就是 OpenAI 去年年底的状态。而他们给出的结论,跟你的第一反应正好相反。

先看两家被压成什么样

两个月前,OpenAI 工程博客发了一篇《Scaling Git at OpenAI》。11 月 2 日,作者是 Aaron Friel、Taylor Blau 和 Ted Nyman 三个人。

起因写得很平实:Codex 普及之后,一个工程师手头同时挂着好几个改动等 CI,而每次 push 又会触发多个任务去拉同一个 commit。去年年底开始,拉取和推送变慢,合并开始失败,可靠性一度掉到 90% 以下。

Anthropic 那边的数字更狠。他们 10 月 13 日发的那篇里写,2026 年 5 月平均每天合并 2500 个改动,到 9 月超过 3 万个。主分支历史近 100 GB,压缩之后的工作副本还有 25 GB 以上。

光 CI 每天就要检出 2500 万次,这还没算开发环境和 agent 沙箱。峰值时他们维护着几百个内部 Git 镜像。

这里得拆一个在中文圈传得很广的数字。有个说法是一天 600 PB 的 Git 流量。原文那句是「如果用最朴素的方式拉」,意思是把 2500 万次检出乘上每次拉完整仓库,属于算术推演,不是实测流量。他们自己在前面加了 Fetched naively 这个前提。

所以症状是同一个:机器写代码的速度,超过了版本控制系统被设计时预期的读者和写者数量。

那病因呢?

OpenAI 只动了最底下一层

他们的诊断可以拆成一句话:这是 Git 的极限,还是我们托管单一大仓库的方式到了极限?

选了后者之后,改法就很清楚了------只换服务端,Git 的命令、协议、客户端原样不动。

Git 扩容其实只有两个维度:很多人往不同分支写,很多人读同一段历史。Pando 对这两个方向各做了一个选择。

写的方向,按分支独立协调。推 foo 的人不用等推 bar 的人,不相关的分支并行推进。读的方向,不再给每个客户端单独打一个包,而是复用同一批 packfile------客户端可能多下一点自己已经有的对象,但服务器算一次,同样的字节能发给成千上万个客户端。

效果按官方说法:中位推送延迟降到原来的五分之一,每天要发近 1 PB 的 Git 数据。还有个更具体的数,一小时发过 57 TB 的 packfile,其中 99% 以上来自本地磁盘缓存,几十个 CPU 核就够。

真正有意思的是他们否掉的两条路。这两条恰好是大部分团队会先想到的:

方案 写这条路 读这条路 仓库级一致性
三阶段提交 推送要把包复制到所有副本,还得等多数派点头 本地有完整副本,快 有
共享 WAL + manifest 连推不相关分支也要改同一个 manifest 要从日志里追,慢 有
Pando 按分支独立协调,不同分支并行 复用 packfile,99% 命中本地缓存 放弃,改因果一致

三阶段提交死在「等多数派」上。原文那句话点得很准:等待多数派,等于把副本的磁盘性能和网络延迟放进了推送路径。

共享 WAL 死在「同一个 manifest」上。compare-and-swap 的往返时间,直接卡住了发布新 manifest 的频率------推不相关的分支也要排队。

两条路栽在同一个地方:所有写操作都得抢同一个协调点。

代价是仓库不再有一个统一时间点

这是整件事里最容易被忽略的一段,也是我最想让你看清楚的一段。

Pando 放弃的第一样东西,是仓库级一致性。它提供的是因果一致性。

翻成人话:同一条分支上的更新还是严格有序的,但你的仓库不再有一个「此刻所有分支都长这样」的快照。

原文举了个例子。一次完整 clone 的协商期间,假设 foo 和 bar 都被更新了。协商结束时,一个客户端可能看到 foo 是 v1、bar 是 v2;另一个客户端看到的正好相反,foo 是 v2、bar 是 v1。

听着像学术细节,落到实处是这样的。

任何需要「同时读多个分支、并且假设它们属于同一个时刻」的脚本,都可能读到一个现实中从未存在过的组合。CI 里那种拿 A 分支的配置去跑 B 分支测试的活儿,就是典型。

OpenAI 的辩护是:实际上人和 agent 都不在意 ref 的全局顺序,他们在意的是单条 ref 上的顺序。这个辩护站得住。

它不站得住的地方,是自动化开始跨分支做判断的时候。比如判断「主干和发布分支是不是指向同一批改动」,比如把三个分支的依赖版本对齐。这类逻辑过去靠的是一个隐式假设,现在得自己写显式检查。

顺带说一句,单条 ref 内的更新仍然是串行化的。所以日常用 git push、git merge、git log 的体验,一点没变------这也是他们敢只换后端的原因之一。

Anthropic 把三层都换了

Scion 走的是另一条路,而且走得彻底。

客户端不再持有完整仓库。提交、rebase、合并都在服务端做,查历史、看 diff 是 API 调用,工作副本是可选的、虚拟的,文件被读到时才出现。

7 个人,5 个月,做出 Scion、一个叫 Antique 的代码评审工具,还有半打配套系统,把整个主干迁了过去。

按他们的说法,基础设施占用小了 200 倍(CPU 和内存),CI 检出从分钟级降到秒级,光 CI 就省出 25% 的 CPU 容量。

这三层里,最上面那层原本是 Git 二十年攒下来的资产:完整的本地副本、离线也能提交、任何工具都能直接读 .git 目录。Scion 把这份资产换成了另一份------服务端算完再发结果。

他们的代价在合并队列

这里有个反问,我觉得是全文最狠的一句:

当成百上千个改动能在测试还在跑的时候合并,CI 到底意味着什么?

(那他们怎么保住主干的绿?)

答案是不保了。

行业标准的合并队列会给仓库上一把全局锁,一个一个来,每个改动都对着最新的主干加上前面排队的那些跑一遍。Anthropic 说自己没能把这件事在 agent 规模下复刻出来,于是把门挪到了后面------投在合并后、部署前的自动测试上。

代价是主干可能一段时间是坏的。并发改动会冲突,他们的应对是让 Claude 去修,官方说通常比人发现得还快。这句话我信一半:修得快是真的,但「主干坏着的时候有人在往里合」这个窗口,不会因为修得快就消失。

他们还自己划了边界,原话是:Scion 绝不是 git 的通用替代品。紧跟着的限定是,只有「几万个工程师,或者成群 agent 猛写代码」的超大仓库,这套东西才说得通。

为什么结论会反着来

到这儿你可能会问:都是第一手的监控数据,凭什么一个说 Git 没问题,一个说 Git 不行。

Pando 那篇的三个作者里,有一位叫 Taylor Blau。这个名字在 Git 邮件列表里出现很多年了,发的补丁集中在几何重打包、多包索引、可达性位图这几块------恰好是大仓库能变快的那几个底层特性。

今年 9 月 30 日,他还用 @openai.com 的邮箱往 git 邮件列表发 repack 的补丁,改的是几何重打包时 cruft pack 怎么进多包索引。也就是说,他一边在 OpenAI 重写 Git 后端,一边还在往上游交代码。

让一个长年在 Git 存储层动手的人去诊断「仓库为什么变慢」,他很难得出「把这东西扔了」的结论。他更可能去看:协议里是不是早就留了口子,只是没人真正用起来。

(这算不算屁股决定脑袋?)

某种程度算。但反过来看,这件事比「谁对谁错」有用得多:同一个技术问题,你请谁来看,决定了你拿到什么答案。

请一个 Git 存储层的维护者,他会还你一个兼容 Git 的后端。请一个习惯服务端集中式方案的人,他会还你一套新系统。两家都没错,只是擅长的地方不一样。

Anthropic 那篇没有公开署名,作者背景我不猜。但从方案形态看,那种「客户端不该持有状态、都交给服务端算」的思路,不太像从 Git 这条线长出来的。这一步是推测,我没找到公开材料。

你的团队要不要动

(那我们是不是也该重写一个?)

不用。

Pando 至今没有代码、没有 API、没有部署指南,能拿到的只有客户端的 Git 分支 openai/git 和一批已经进上游的补丁。Scion 更直接,官方说不适合通用场景。

(那看这两篇有什么用?)

三个信号现在就能量:push 的中位延迟、单次 checkout 的耗时、同一条分支上同时 push 的次数。前两个开始变差、第三个经常超过一两个,说明你也快撞上了。

在撞上之前,有三件事不用重写就能做。

bash 复制代码
# 给 agent 的沙箱用稀疏检出,别每次全量拉
git clone --filter=blob:none --sparse https://git.example.com/app.git
cd app && git sparse-checkout set services/payments

# 每个 agent 一个独立 worktree,别在一个检出里互相踩
git worktree add ../agent-42 feature/agent-42

第三件是把合并队列配上必需检查,让「谁先合」这件事显式化,而不是靠谁手快。

代价也都有。稀疏检出会让依赖全量目录的构建直接失败,worktree 开多了磁盘占用翻倍,合并队列会拉长单次交付的感知时间。它们买的是撞墙时不至于手忙脚乱,不是更快。

最后

把这两篇合起来看,真正值得带走的不是哪个方案。

同一个症状,可能对应完全不同的病因,而病因取决于谁在诊断。

OpenAI 放弃了全仓库的时间点快照,换到了五倍的推送速度。Anthropic 放弃了全局锁的合并队列,换到了秒级的检出和 200 倍小的基础设施。

两家都不是给普通团队准备的。能抄的只有那几个可以量的信号,和那句反问:你流水线里哪一步,是必须一个一个来的?

那个「必须一个一个来」的地方,就是 agent 压过来时最先响的地方。

参考资料

作者:唐悦玮 | 从后端出发,用 AI 拓展到全栈的工程师。

相关推荐
天天被压力22 分钟前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python
爱敲代码的小黄8 小时前
神经网络入门指南:从 CNN、RNN 到 Attention
人工智能·面试·程序员
一只爱撸猫的程序猿9 小时前
我看着一个 AI 引擎在 14 天里,从"记忆"走进了"搜索"
人工智能·后端·架构
我登哥MVP10 小时前
DeepSeek-Harness-Super-Agent-学习笔记
人工智能·深度学习·神经网络·机器学习·自然语言处理·agent
LucianaiB10 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程
小虎AI生活11 小时前
REA(rea.tools) 接入 WorkBuddy 实操:Electron ASAR 免解压静态分析到零代码复刻
aigc·ai编程
冬奇Lab12 小时前
一天一个开源项目(第256篇):Anatomy —— 让 Claude 为技术概念「发明一台机器」,画成可交互的等距插画
人工智能·开源
孟郎郎12 小时前
打造一切(Craft Anything)——克隆构造世间万物
人工智能·ai·github·软件构建·开源软件
Martina_032112 小时前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图