跳到內容

Technology

新聞|Anthropic 自建 Scion:合併量從每天 2500 衝到 3 萬後,怎麼重做版本控制

Anthropic 的 monorepo 合併量在四個月內成長十倍以上,git 撐不住後,七人團隊用五個月做出自家版本控制系統 Scion 並完成遷移。整理 Scion 的設計原則、changeset 與 derived data 的資料結構、分層快取的 checkout 協定、實測效益,以及這個做法適用的範圍。

AI
Published: at 09:00 AM
編輯本頁下載圖卡

重點

問題有多大

Anthropic 工程部落格在 10 月 13 日(美國時間)發表這篇文章,作者是 Nick G. 與 source control 團隊。文章開頭的判斷是:寫程式已經不是瓶頸,Claude 能自己跑研究迴圈、做程式微最佳化、從零建服務,卡住的是為人類規模設計的開發基礎設施。

合併量的變化:

時間每天合併到 monorepo 的變更
2026 年 5 月約 2,500 次
2026 年 9 月超過 30,000 次

作者認為合併需求幾乎沒有上限,每拿掉一個瓶頸,產出的程式碼量就會再往上跳。

repo 本身的規模:

git 的擴充手段為什麼不夠

git 是分散式設計,每份 clone 都是完整的 repo,離線也能算 diff、看歷史、跑 blame、切換任何版本。對絕大多數 repo 來說這是對的設計。

大型 monorepo 常用的補救方法,Anthropic 都用過:

合併速度上升後,這些方法越來越難維運。seed 每次刷新之間離 main 的最新版本越來越遠;在 partial clone 上要讓 diff、blame 這類依賴歷史的操作維持正常,也需要越來越多心力。mirror 最後碰到磁碟與記憶體上限,無法再擴充。

團隊注意到,他們實際上把 git 當成集中式系統在用,只有一份權威副本,客戶端又幾乎都是本來就在線的 agent 與 job。git 適合離線分散工作的特性,反而妨礙了擴充。於是他們問:如果從一開始就假設 agent 永遠在線,版本控制該長什麼樣子?

六條設計原則

大型 monorepo 的版本控制有前例,例如 Google 的 Piper 與 Meta 的 Sapling,Scion 參考了它們的經驗。文章列出的原則:

  1. 客戶端永遠在線:協定圍繞一台隨時連得到的伺服器設計,客戶端需要什麼資料再去抓。
  2. 客戶端與伺服器不對稱:檔案歷史、blame、建立 commit、merge、rebase 都由伺服器做。客戶端維護有上限的本地物件快取、把檔案放到磁碟上、監看檔案系統變化,自己能算的東西很少,相對地只需要很少的本地資料。
  3. 完整的版本控制服務 API:客戶端用到的查詢都開放成 API,例如「這行最後是誰改的」「兩個 commit 是什麼關係」。很多 CI job 不需要本地 repo;自動 bisect、自動 revert 這類內部工具,沒有便宜的程式化存取就無法大規模運作。
  4. 所有元件都能水平擴充:資料分散存放,各元件獨立擴充,連伺服器上都沒有一份完整展開的 repo。沒有 packfile,所以也不需要 repo 維護作業。
  5. commit 要便宜、增量、無鎖:每次 commit、rebase、merge 都在伺服器上發生,沒有 push 這一步。建立 commit 與更新下游資料結構的成本要跟變更大小成比例,跟整個 repo 的大小無關。除了 main 與 release branch,盡量不用 ref,因為所有伺服器都得同意的全域狀態遲早會變成擴充問題。
  6. 工作副本可有可無,而且預設稀疏:CI job 要某個 commit 跟 merge base 的 diff,可以直接問伺服器;很多寫入也能完全透過 API 完成。真的要在磁碟上放檔案時,協定以 sparse checkout(只放要求的目錄)與 virtualized checkout(讀到才展開檔案)為核心。

資料結構:changeset 與 derived data

Scion 的基本單位是 changeset,也就是 write-ahead log 裡的一筆紀錄。它跟 git commit 的差別在於存什麼:

git commitScion changeset
內容指向整棵 tree 的指標相對於第一個 parent 有變動的檔案清單,加上指向 blob storage 中壓縮檔案內容的 content-addressed 指標
建立位置本地,之後 push伺服器端,建立後各處立即可用

只記錄第一個 parent 的變動是刻意的選擇。文章的註腳說,在 trunk-based 開發的 monorepo 裡,大家只關心主線上 commit 的歷史與 blame。

這個結構讓伺服器能以很高的吞吐量接收 changeset:沒有 packfile 要收、不需要鎖或跨伺服器協調、也不用移動 ref。Scion 技術上支援 ref,但建立與抓取 commit 都用不到它;移動一個 ref 是對 Spanner 單一資料列做 compare-and-swap,跟建立 changeset 分開進行。

changeset 只記錄變動,沒辦法直接回答「誰最後改了這行」「哪些 commit 動過這個檔案」。Scion 另外從 changeset 建出 file blame、path history 等資料結構,以及 commit graph 的 skip list,統稱 derived data。所有 derived data 都走同一種機制:每種資料遞迴定義,某個 changeset 的值由它的 parent 的值算出來。

這個機制的好處:

Checkout:只要缺的物件

一小群 Scion server 提供客戶端需要的 API:取得 changeset、算 diff、找 merge base、抓 blob。所有資料都是 content-addressed,存進去之後就不會變,任何伺服器都能直接快取,不必跟其他伺服器確認。伺服器因此可以水平擴充,本質上是會即時計算 derived data、再把結果寫回 Spanner 的大型快取。

遷移初期還沒有自己的客戶端與協定時,Scion 只回答 metadata 查詢(ancestry、blame 等)。抓檔案內容、展開工作副本的資料量大得多,另外設計了 scn 客戶端與協定。

跟 git fetch 協定的差異:

分層架構:

  1. scion-daemon:每台節點一個,客戶端經 socket 跟它溝通。同一台節點上的 job 大多共用相同物件。daemon 從定期刷新的快照起步。
  2. scion-cache:每個區域的 tree 與 blob 快取伺服器。直接從記憶體串流 daemon 能直接使用的磁碟格式,不用計算缺漏物件或做 delta 壓縮。
  3. scion-server:快取沒有的物件才往這層要,再從 Spanner 或雲端儲存讀取。

三層回應同一組 RPC,客戶端不需要知道快取拓撲。理論上任何一層都能跟任何一層溝通,但團隊嚴格規定只能逐層往上,用來隔離故障範圍,避免一個區域的 scion-cache 故障時把上游 scion-server 壓垮、拖垮整個系統。

實測效益

開發過程的經驗

Scion 開工的時間,跟 Claude Mythos Preview、Claude Tag 在內部開放的時間差不多。文章說這兩者同時放大了對 Scion 的需求,也加快了開發速度。

模型重寫既有元件。 git 到 Scion 的資料匯入管線,第一版是團隊年初手寫的原型。拿到 Claude Mythos Preview 的早期內部快照後,他們請它整個重寫,沒有給其他指示。新版本記憶體用量少 20 倍、速度快 4 倍,而且保留了匯入順序與資料結構相關的隱含不變量。

小團隊、短時程。 七個人在五個月內做出 Scion、Antique,以及大約六個相關系統,同時期每天的合併量成長了 10 倍。作者認為這類工作過去需要多年的漸進遷移與多得多的工程師。

工程師的工作內容改變。 參與的工程師都認為 Claude 寫程式比自己好,但系統間的整體結構、設計取捨與規模目標仍由工程師決定。文章說工程師很多時候是在對 Claude 說「不」:

測試與防護。 因為 Claude 產出程式碼的速度快,即使時程很緊,團隊仍為每一種遇過的非平凡基礎設施與版本控制互動建了 hermetic simulation,另外有 fuzzing 與細緻的 rate limiting。Claude 也找到過 ancestry 查詢的演算法最佳化,起因是查詢漏用了一個索引。

權限控管。 Scion 支援 repo 層級的存取控制,也能對個別目錄設權限,保護最敏感的程式碼又保留 monorepo 的好處。Antique 能表達複雜的核准條件,例如區分只改註解的變更與敏感的邏輯變更,讓人類審查者專注在影響最大的變更。

監控。 團隊在 Slack 頻道裡讓 Claude 各自專注監看單一元件,稱為「superfan」,例如 scion-daemon superfan、scion-cache superfan、Antique merge queue superfan。它們能讀遙測與 log,能抓到傳統告警看不出的細微新問題。傳統告警仍然保留。

merge queue 要重想。 測試還在跑的時候,可能已經有幾百甚至幾千個變更合併進去。團隊沒辦法有效複製業界常見的 merge queue 全域 repo 鎖,改投資在合併後與部署前的自動化測試。代價是同時進行的變更可能互相衝突,文章說 Claude 修這些衝突通常比人類發現它們還快。

跟 git 生態系的關係

文章對適用範圍講得很直接:

作者預估這類問題會在未來 6 到 12 個月變得常見,所以選擇公開設計思路,讓 git 平台在不脫離 git 模型的前提下借用:

文章最後提到想跟 GitHub、GitLab 與開源社群合作。

限制與待觀察

參考資料

註釋

編輯本頁

Podcast

關於語音摘要

此語音摘要由 Google NotebookLM 提供,不完全代表作者本人對文章的理解。