<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>版本控制 on 搬砖程序员带你飞</title>
        <link>https://lpflpf.cn/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/</link>
        <description>Recent content in 版本控制 on 搬砖程序员带你飞</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <managingEditor>lipengfei634626165@163.com (lpflpf)</managingEditor>
        <webMaster>lipengfei634626165@163.com (lpflpf)</webMaster>
        <lastBuildDate>Fri, 16 Oct 2026 07:30:00 +0800</lastBuildDate><atom:link href="https://lpflpf.cn/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Anthropic 扔掉了 Git，但社区复刻它的那份 Go 代码有 6 个 commit 就停了</title>
            <link>https://lpflpf.cn/posts/scion-open-source-git-alternative-2026-10-16/</link>
            <pubDate>Fri, 16 Oct 2026 07:30:00 +0800</pubDate><author>lipengfei634626165@163.com (lpflpf)</author>
            <guid>https://lpflpf.cn/posts/scion-open-source-git-alternative-2026-10-16/</guid>
            <description>&lt;img src=&#34;https://cdn.lpflpf.cn/images/posts/scion-cache-tiers-2026-10-16.png&#34; alt=&#34;Featured image of post Anthropic 扔掉了 Git，但社区复刻它的那份 Go 代码有 6 个 commit 就停了&#34; /&gt;&lt;p&gt;十月中旬这几天，Anthropic 开不开源 Scion 这件事，被传播读反了两次。第一次是&amp;quot;Git 要完了&amp;quot;，第二次是&amp;quot;Anthropic 开源了 Scion&amp;quot;——两条都不对。官方工程博客的原话是 Scion is by no means a suitable replacement for git for general use，而那个 24 小时内冒出 695 star 的 Go 仓库，作者署名 feder-cr，是自己看着博客复刻的第三方实现。&lt;/p&gt;&#xA;&lt;p&gt;本文写给正在把 coding agent 接进 CI/CD、或者维护着中大型 monorepo 的后端和平台工程师。结论先说：&lt;strong&gt;99% 的团队今天不该换 VCS&lt;/strong&gt;，但应该这周就去量自己仓库的两个数。&lt;/p&gt;&#xA;&lt;h2 id=&#34;崩掉的前提不是用-git是每个-client-都得持有一整份仓库&#34;&gt;崩掉的前提不是&amp;quot;用 Git&amp;quot;，是&amp;quot;每个 client 都得持有一整份仓库&amp;quot;&#xA;&lt;/h2&gt;&lt;p&gt;Anthropic 官方博客给出的数字是：2026 年 5 月平均每天合并约 2,500 处变更，到 9 月超过 30,000 处，四个月涨了十倍以上。主分支历史接近 100 GB，压缩后的工作副本仍然超过 25 GB，仅 CI 每天就有约 2,500 万次代码检出——按朴素拉取折算，一天超过 600 PB 的 Git 流量。&lt;/p&gt;&#xA;&lt;p&gt;这些数字容易让人得出&amp;quot;Git 不行了&amp;quot;的结论，但博客里其实把原因写得很清楚：Git 是去中心化设计，每个 clone 都是完整自包含的仓库，能离线算 diff、读 history 和 blame、检出任意 revision。&lt;strong&gt;对绝大多数仓库，这正是对的设计&lt;/strong&gt;，也是它成为标准的原因。&lt;/p&gt;&#xA;&lt;p&gt;问题出在负载形态变了。Anthropic 自己复盘时说得很直接：他们像大多数公司一样，把 Git 当集中式系统用、只有一份权威副本，但几乎所有 client 都是 agent 和 job——而这些东西定义上就是在线的。于是&amp;quot;为分布式离线场景服务的优秀特性&amp;quot;，在仓库变大之后反过来成了负担。&lt;/p&gt;&#xA;&lt;p&gt;他们在峰值时运营了几百个内部 Git 镜像，还用 blob storage 存仓库快照做种子。这些手段买了时间，但随着 merge 速率上升越来越难运营：种子刷新一次就离 main 尖端更远，而且要让 diff、blame 这类依赖历史的操作在 partial clone 上正常工作，需要的照料越来越多。&lt;/p&gt;&#xA;&lt;p&gt;用 Anthropic 官方的话说，真正的错配是这句：客户端几乎永远在线，Git 最擅长的离线分布式能力成了纯负担。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Scion 检出架构示意图：客户端经 scion-daemon 缓存到区域 scion-cache，再回源到权威 scion-servers，后端为 Spanner 与对象存储；每层命中率 &gt;99%&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;225px&#34; data-flex-grow=&#34;94&#34; height=&#34;2986&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://cdn.lpflpf.cn/images/posts/scion-cache-tiers-2026-10-16.png&#34; srcset=&#34;https://lpflpf.cn/scion-cache-tiers-2026-10-16_10841257801647018326_hu_418979ddc2eaf038.png 800w, https://lpflpf.cn/scion-cache-tiers-2026-10-16_10841257801647018326_hu_47221e7eb60d380e.png 1600w, https://lpflpf.cn/scion-cache-tiers-2026-10-16_10841257801647018326_hu_a8099752f0dae8e3.png 2400w, https://cdn.lpflpf.cn/images/posts/scion-cache-tiers-2026-10-16.png 2810w&#34; width=&#34;2810&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;三层架构对应官方博客描述的 scion-daemon / scion-cache / scion-servers，数据来源：Anthropic 工程博客《Redesigning source control at Anthropic》。&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;该抄的是&amp;quot;把工作挪到服务端&amp;quot;这个判断，而不是 Scion 本身。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;六条设计原则里你能拿走的只有三条半&#34;&gt;六条设计原则里，你能拿走的只有三条半&#xA;&lt;/h2&gt;&lt;p&gt;Scion 的设计原则在官方博客里列了六条。把它们逐条对着自己的仓库读一遍，会发现里面其实混着两种东西：一种只和&amp;quot;你有个巨型 monorepo&amp;quot;有关，另一种和&amp;quot;你的 client 是在线 agent&amp;quot;有关。后者才可能迁移。&lt;/p&gt;&#xA;&lt;p&gt;先看能拿走的：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;服务端 API 替代&amp;quot;clone 下来自己算&amp;quot;。&lt;/strong&gt; 官方原则里最实用的一条是：Git 下，一个 CI job 想回答&amp;quot;谁最后改了这行&amp;quot;或&amp;quot;这两个 commit 什么关系&amp;quot;，必须维护一份本地仓库，或者指望厂商 API 恰好提供答案；Scion 里客户端用到的所有查询都同时通过 API 暴露，很多场景下 job 根本不需要本地仓库。Anthropic 说他们的自动 bisect 和 revert 流水线在规模化下离不开这种廉价的程序化访问。对你不换 VCS 也能做——现在各家 forge 都在补这类 server-side 查询接口。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;内容寻址让缓存不需要协调。&lt;/strong&gt; 官方的说法是：所有源码数据都是内容寻址的，一份数据存进去之后永不改变，因此任何 server 都能缓存它、不必和其他 server 确认。这是最值得单独记住的一条工程原理——&lt;strong&gt;不可变 + 内容寻址 = 缓存层零协调成本&lt;/strong&gt;。它和 Git 无关，任何有大量重复读取的系统都适用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;稀疏和虚拟化检出，不要每次全量落盘。&lt;/strong&gt; 官方原则是&amp;quot;工作副本是可选的、设计上就是稀疏的&amp;quot;：CI job 要 diff 就让服务端给 diff，写操作也可以完全走 API 跳过检出；需要文件时，客户端只为它真正读到的内容付费。你没有 Scion，但 Git 的 sparse-checkout 加 partial clone 组合能拿到相当一部分收益。&lt;/p&gt;&#xA;&lt;p&gt;再看拿不走的：Spanner 级强一致 CAS、自建的代码审查（Antique）、代码搜索和 CI、近乎无上限的 token 预算，以及&amp;quot;superfans&amp;quot;那套运维模式——官方描述是让 Claude 常驻盯着单个组件的健康度，像一个&amp;quot;没别的事干、只刷图表找异常&amp;quot;的资深工程师。这四样都绑定 Anthropic 自己的组织规模和成本结构，照搬只会得到一个更难维护的系统。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;可迁移 / 不可迁移对照：左侧三项可迁移（服务端 API、内容寻址缓存、稀疏与虚拟检出）外加半条（去全局 merge lock），右侧四项不可迁移（Spanner 级 CAS、自建评审与 CI、无限 token 预算、superfans 运维），每项标注原因&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;162px&#34; data-flex-grow=&#34;67&#34; height=&#34;2460&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://cdn.lpflpf.cn/images/posts/scion-migratable-matrix-2026-10-16.png&#34; srcset=&#34;https://lpflpf.cn/scion-migratable-matrix-2026-10-16_13332178164988888439_hu_ac7efc1b6dfe0a46.png 800w, https://lpflpf.cn/scion-migratable-matrix-2026-10-16_13332178164988888439_hu_d7824e9f0bd5c7cf.png 1600w, https://cdn.lpflpf.cn/images/posts/scion-migratable-matrix-2026-10-16.png 1670w&#34; width=&#34;1670&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;对照依据：Anthropic 官方博客 Principles 段落 + open_scion README 的设计映射表。&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;那份-go-复刻复刻的是设计不是-anthropic-的运行环境&#34;&gt;那份 Go 复刻复刻的是设计，不是 Anthropic 的运行环境&#xA;&lt;/h2&gt;&lt;p&gt;在社区复刻出现之前重读官方博客，你会注意到一个容易被忽略的细节：Anthropic 说&amp;quot;Git server 不必和 Git client 一样工作&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;这句话在 10 月 15 日被具象化了。&lt;code&gt;feder-cr/open_scion&lt;/code&gt; 于 2026-10-15T13:12Z 建库，语言 Go，700★ 出头 / 60 fork / 0 open issue，README 首段自述是&amp;quot;an independent implementation of the publicly described design. It is not affiliated with or endorsed by Anthropic&amp;quot;。它不是 Anthropic 的代码，也未经其认可。&lt;/p&gt;&#xA;&lt;p&gt;它挑的实现路径本身值得看一眼，因为它回答了一个真问题：&lt;strong&gt;server 化的版本控制是不是必须从零写。&lt;/strong&gt; 答案是不必——它 fork 了 Gitaly，也就是 GitLab 那个 MIT 协议的 Git RPC server，把 Git 的底层 plumbing 原样留着，上游的每个 Gitaly RPC 都还能用。这是&amp;quot;可迁移&amp;quot;主张最直接的实物证据：服务端化不必重写 Git，只需要在它上面加一层。&lt;/p&gt;&#xA;&lt;p&gt;它的设计映射里有三处对工程判断有参考价值。一是服务端把 blame、path history、ancestry、code search 当作 derived data 算一次并记忆化，而不是让每个 client 本地算。二是落地用 CAS 而不是 merge queue，并发的 land 会被批量合并成一次 reference 更新。三是冲突解决是可插拔的——可以接任意 LLM provider，也可以用确定性工具，或者干脆不用，协议本身保持厂商中立，server 不调用任何模型。&lt;/p&gt;&#xA;&lt;p&gt;但紧接着必须说清楚它现在是什么状态。我核对了仓库的 commit 历史：&lt;strong&gt;整个仓库一共 6 个 commit，全部落在 2026-10-15 13:09Z 到 13:24Z 这 15 分钟之内&lt;/strong&gt;，最后一条是 13:24:44Z 的 &amp;ldquo;test: build test binaries without VCS stamping&amp;rdquo;。这是一次性把初始版本推上去，不是持续开发出来的。README 自己也写明这是 0.1.0 首次公开发布、接口在 1.0 前仍可能变，已知缺口（比如 storage core 里 pack 的垃圾回收）记在 &lt;code&gt;doc/graft/LIMITATIONS.md&lt;/code&gt; 里。&lt;/p&gt;&#xA;&lt;p&gt;作者本人也标了 LLM 使用的关键细节：&lt;strong&gt;&amp;ldquo;every AI feature works with any provider, or none.&amp;rdquo;&lt;/strong&gt; 这既意味着它不能被当成&amp;quot;Anthropic 官方路线&amp;quot;，也意味着它比一篇大厂博客更接近一个你能真的 clone 下来读的架构样本。700 个出头的 star 是热度，不是生产验证。想读代码结构的话，它的 &lt;code&gt;proto&lt;/code&gt;、&lt;code&gt;sdk&lt;/code&gt;、&lt;code&gt;internal/graft&lt;/code&gt;、&lt;code&gt;middleware&lt;/code&gt;、&lt;code&gt;auth&lt;/code&gt;、&lt;code&gt;proxy&lt;/code&gt; 目录是官方六条原则的目录级落点，&lt;code&gt;doc/graft/ARCHITECTURE.md&lt;/code&gt; 和 &lt;code&gt;STORAGE.md&lt;/code&gt; 解释取舍——&lt;strong&gt;当设计文档读，别当方案选。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;你要装的两个报警器和一条顺手就能做的改造&#34;&gt;你要装的两个报警器，和一条顺手就能做的改造&#xA;&lt;/h2&gt;&lt;p&gt;回到开头那个主张：不换 VCS，但要开始量。&lt;/p&gt;&#xA;&lt;p&gt;Anthropic 的博客里藏着一个对普通团队最有用的信号：他们说无法有效复制&amp;quot;合并队列全局仓库锁&amp;quot;这个行业标准做法，于是改为投资 post-merge 和 pre-deploy 的自动化测试。代价是并发改动会冲突，他们靠 Claude 修冲突——官方说法是它修冲突往往比人发现问题还快。&lt;strong&gt;没有同等 agent 修复能力的团队不能照搬这一步&lt;/strong&gt;，这是明确的边界。&lt;/p&gt;&#xA;&lt;p&gt;所以体检从三个数开始，对应三个不同的处置档位：&lt;/p&gt;&#xA;&lt;p&gt;第一，量你的 CI 里有多少 job 是 &lt;code&gt;git clone&lt;/code&gt; 全量，有多少其实只需要一次平台 API 调用的 diff 或 ancestry 查询。如果全量 clone 占大头，而 job 本身只跑几分钟——这是能改的一档，改的方向是 API 优先。&lt;/p&gt;&#xA;&lt;p&gt;第二，量 agent 每次起 sandbox 的 checkout 时间和字节数。字节数开始接近仓库压缩副本的量级、时间进入分钟级，就是该观察的一档，先开 partial clone 和 sparse-checkout。&lt;/p&gt;&#xA;&lt;p&gt;第三，量从 push 到 land 到 main 的 p95 延迟。这个数开始随并发 agent 数量线性上涨，就是该动手的一档——此时才轮到讨论&amp;quot;是不是要动服务端架构&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;四步改造按这个顺序做，每一步都不需要换 VCS：CI 改成 API 优先，能问平台就不要 clone；打开 partial clone 和 sparse-checkout；在中间加一层按内容寻址的对象缓存（记住第一条原理——内容不变，缓存就不需要协调）；最后才考虑把全局 merge lock 换成 post-merge 测试，而这一步取决于你修冲突的自动化能力，没准备好就别做。&lt;/p&gt;&#xA;&lt;p&gt;官方对时间窗口的判断是，这类扩展问题会在未来六到十二个月变得更普遍，而每个用 Git 的公司各自去撞一遍是低效的。他们给出的方向也很克制：让 Git 平台提供更完整的 server-side RPC，让协商协议不再是今天的样子，让 sparse 和 shallow 各种特性能够良好组合。&lt;/p&gt;&#xA;&lt;p&gt;一句话收束：&lt;strong&gt;你先撞到的几乎一定是&amp;quot;评审和 CI 的假设&amp;quot;，不是&amp;quot;必须自建 VCS&amp;quot;。&lt;/strong&gt; 所以今晚别去 clone 那个 700 star 出头的仓库当方案用，去把它当设计文档读；真正要动手的，是在你的 CI 配置里 grep 一下 &lt;code&gt;git clone&lt;/code&gt;，看看有几个 job 其实只想问一句话。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
