跳到主要內容
maxstudioNews
AI 自動化DEV Community (Codex)約 10 分鐘

在單一儲存庫平行執行 Claude Code 與 Codex:Git Worktree 實戰技巧與跨代理審查

本文探討在單一程式碼儲存庫中平行執行 Claude Code 和 Codex 時遇到的挑戰,例如檔案衝突、用量限制和審查盲點。作者提出解決方案,包括為每個代理建立獨立的 Git worktree、利用不同代理進行程式碼審查,以及透過多個帳號來規避用量限制,以提升開發效率。

在單一儲存庫平行執行 Claude Code 與 Codex:Git Worktree 實戰技巧與跨代理審查
圖片來源:DEV Community (Codex)

我正在開發一款名為 Offrun 的 Mac 應用程式。本文中提及的所有內容都適用於純粹的 Git 和代理程式 CLI 工具,文末會簡短介紹 Offrun。

問題在於,當您在同一個儲存庫中同時執行 Claude Code 和 Codex 時,很快就會遇到三個問題:兩個代理程式會編輯相同的檔案,導致其中一個代理程式的變更破壞另一個的工作樹。其中一個帳號達到用量限制,導致工作中途停止。要求撰寫差異的代理程式自行審查,往往會錯過它在撰寫時就已錯過的問題。

本文將逐一解決這些問題:為每個代理程式提供獨立的 Git worktree,讓不同的代理程式審查未提交的差異,並分開登入以避免用量限制導致工作停止。文末還會列出我實際執行和未執行的項目。本文在 macOS 上使用 Git 2.50.1、Claude Code 2.1.296 和 Codex CLI 0.162.1 進行測試。

1. 每個代理程式一個 Worktree

Git worktree 是連接到同一個儲存庫(即同一個 .git 目錄)的額外工作目錄。每個分支都有自己的資料夾,因此代理程式可以在自己的資料夾中自由編輯,而不會影響彼此的工作樹。您可以這樣操作:

cd ~/work/app

git worktree add ../app-refactor -b refactor

git worktree add ../app-bugfix -b bugfix

git worktree list

/Users/me/work/app c5cd751 [main]

/Users/me/work/app-bugfix c5cd751 [bugfix]

/Users/me/work/app-refactor c5cd751 [refactor]

然後為每個資料夾啟動一個代理程式:

cd ../app-refactor && claude # 第一個終端機

cd ../app-bugfix && codex # 第二個終端機

Claude Code 有一個 -w 或 --worktree [name] 選項,可以為會話本身建立一個 worktree。Codex 沒有等效的選項,因此本文堅持使用純粹的 Git,它適用於兩者。請將 worktree 放在儲存庫旁邊,而不是儲存庫內部。如果您將它們放在內部,請將該資料夾新增到 .gitignore 中,否則主工作樹會將其顯示為未追蹤。

2. 陷阱

本節中的所有內容都是針對一個一次性儲存庫執行的。同一個分支不能在兩個 worktree 中簽出。Git 會拒絕讓兩個 worktree(因此是兩個代理程式)共享一個分支,這是一個有用的安全網。如果您想從同一個起點進行兩次嘗試,請使用 -b 建立第二個分支。

.env 和 node_modules 不會自動複製。新的 worktree 只會簽出追蹤檔案。列在 .gitignore 中的 .env 檔案不會存在,上次 npm install 後產生的 node_modules 也一樣。當代理程式的第一個動作因「缺少環境變數」或「找不到模組」而失敗時,這通常就是原因。一個在 ~/.zshrc 中的小函數可以一次性建立 worktree 並複製 .env:

wt () {

local name = $1

root dest

root = $( git rev-parse --show-toplevel ) || return

dest = "${root}-${name}"

git worktree add "$dest" -b "$name" || return

[ -f "$root/.env" ] && cp "$root/.env" "$dest/.env"

echo "$dest"

}

cd ~/work/app && wt refactor # 建立 ~/work/app-refactor 並複製 .env

我省略了依賴項安裝,因為它因專案而異。像 pnpm 這樣具有共享儲存的套件管理器,在您新增 worktree 時可以減少磁碟使用量。暫存區(stash)在 worktree 之間是共享的。由於只有一個 .git,因此只有一個暫存區。在另一個 worktree 中建立的 git stash 會顯示在主 worktree 的 git stash list 中:

$ git -C ../app-x stash -q

$ git stash list # 在主 worktree 中

stash@{0}: WIP on x: c5cd751 init

代理程式使用 git stash 和 git stash pop 的頻率比您想像的要高。為了防止一個會話彈出另一個會話的暫存區,請在您平行執行時,在代理程式指令檔案(CLAUDE.md, AGENTS.md)中新增一行:不要使用暫存區;改用臨時提交來暫存進行中的工作。

帶有變更的 worktree 無法移除。Git 會提示「錯誤:'../app-refactor' 包含已修改或未追蹤的檔案,請使用 --force 刪除它」。

--force 會將其移除,以及任何未提交的變更。在執行此操作之前,請先執行 git -C ../app-refactor status。當工作完成後,合併,然後執行 git worktree remove ../app-refactor 和 git branch -d refactor。

還有一個問題,這個我沒有為這篇文章測試,它只是一個常見的平行工作問題。幾個代理程式啟動開發伺服器會爭奪同一個連接埠(例如 3000)。如果連接埠來自 PORT 環境變數,您可以為每個 worktree 提供自己的連接埠,例如 PORT=3001。

3. 讓不同的代理程式審查未提交的差異

代理程式審查自己的差異時,往往會將自己的假設帶入審查中。根據我的經驗,來自不同公司的模型會錯過不同的東西,這正是它作為審查者的有用之處。Codex 作為審查者:Codex CLI 有一個 review 子命令。根據其說明,--uncommitted 會一起審查已暫存、未暫存和未追蹤的變更:

cd ../app-refactor

codex review --uncommitted

使用 --base main 可以針對基礎分支進行審查,或使用 --commit <SHA> 針對單一提交進行審查。Claude Code 作為審查者:Claude Code 使用 -p(--print)以非互動方式執行,因此您可以將差異管道傳入:

git add -N . # 這樣未追蹤的檔案就會顯示在差異中

git diff HEAD | claude -p "審查此差異。指出錯誤、缺少測試和型別不匹配。不要更改任何程式碼。"

需要 git add -N .(意圖新增)是因為 git diff HEAD 會省略未追蹤的檔案。我用一個新檔案 new.ts 和對現有 package.json 的編輯進行了檢查:

$ git diff HEAD --stat

package.json | 1 +

$ git add -N . && git diff HEAD --stat

new.ts | 1 +

package.json | 1 +

如果沒有它,審查者會看到一個差異,其中所有新檔案都悄無聲息地缺失。這很容易被忽略,因此請先執行 add -N。如何處理審查結果:讓審查者指出問題,僅此而已。將修復發送回原始代理程式,或自行修復。如果審查者直接編輯程式碼,您就回到了第一個問題:兩個代理程式觸摸相同的檔案。閱讀審查結果並選擇值得採取的行動,然後再傳遞,這樣一個偏離目標的評論就不會使工作偏離方向。

4. 規劃用量限制

Claude 和 Codex 都會在一段時間內限制用量,平行執行代理程式會讓您更快達到限制。如果有多個登入,當一個帳號用完時,您可以切換到另一個帳號。分開的設定資料夾,分開的登入:兩個 CLI 都允許您使用環境變數移動其設定和憑證:Claude Code 使用 CLAUDE_CONFIG_DIR,Codex 使用 CODEX_HOME。將每個指向一個空資料夾,確認登入狀態是獨立的:

$ CLAUDE_CONFIG_DIR=/tmp/cfgA claude auth status

{ "loggedIn": false, ... }

$ CODEX_HOME=/tmp/cfgB codex login status

Not logged in

因此,為每個登入建立一個別名:

alias claude-b='CLAUDE_CONFIG_DIR=$HOME/.claude-b claude'

alias codex-b='CODEX_HOME=$HOME/.codex-b codex'

claude-b auth login # 使用第二個帳號登入

會話歷史記錄也儲存在每個設定資料夾中,因此 claude-b 不知道 claude 做了什麼。這是下一個問題。當您在任務中途切換時,請自行留下交接資訊。在用量限制強制切換後,新的會話不知道舊的會話嘗試了什麼。我沒有測試在設定資料夾之間複製會話歷史記錄檔案,因此不推薦這樣做。可靠的方法是讓代理程式在達到限制之前將其狀態寫入檔案:

<!-- HANDOFF.md -->

目標

將身份驗證中介軟體移至 TypeScript

已完成

  • 遷移 src/auth/session.ts,0 個型別錯誤

嘗試失敗

  • 停留在 jose v4 會破壞 ESM 導入。需要 v5

下一步

  • 遷移 src/auth/token.ts

在 CLAUDE.md(或類似檔案)中新增一行,說明在每個工作單元結束時更新 HANDOFF.md。然後告訴新登入的會話「閱讀 HANDOFF.md 並繼續」,它就會接續上次會話嘗試的工作。

5. 哪些保持手動

以上所有內容都可以讓您平行執行代理程式,但有些事情仍然需要手動完成:打開每個終端機分頁以查看哪個代理程式正在工作,哪個正在等待您。分別檢查每個 CLI 以查看哪個登入接近其限制。每次都輸入命令來建立 worktree、複製 .env、執行審查和清理。我開發了一款 Mac 應用程式,將這些功能整合到一個地方。

關於 Offrun

Offrun 是我正在開發的一款 Mac 應用程式。它在您的 Mac 上執行 Claude Code、Codex 和 Antigravity CLI,使用您已有的登入資訊。每個聊天都有自己的 Git worktree,一個螢幕顯示哪些代理程式正在工作,哪些正在等待您,以及每個登入還剩下多少用量。

選擇另一個代理程式作為審查者,其對未提交差異的審查結果會顯示在聊天中;審查者只指出問題,從不編輯或合併程式碼。它是免費的,無需信用卡,但您需要自己的代理服務訂閱。它運行在 Apple Silicon Mac(M1 或更新機型)上,需要 macOS 14 或更高版本,首次啟動時會要求您登入 Offrun 帳戶(Google 或電子郵件)。

本文中的所有內容都可以在沒有 Offrun 的情況下運行,因此請先嘗試使用純粹的 Git。

我檢查了什麼,沒有檢查什麼

狀態

同一個分支不能在兩個 worktree 中,.env 不會自動複製,暫存區是共享的,帶有變更的 worktree 無法移除,git diff HEAD 在 add -N 之前會省略未追蹤的檔案:針對測試儲存庫執行

wt 函數:在 zsh 中執行

CLAUDE_CONFIG_DIR 和 CODEX_HOME 分離登入狀態:使用空資料夾檢查

codex review --uncommitted 和 claude -p 存在並執行所述功能:使用 --help 檢查

模型在透過 codex review 和 claude -p 審查時實際說了什麼:未執行(僅命令形式)

連接埠衝突:未測試

這篇文章是使用 AI(Claude)起草的,其中的命令都經過執行以檢查結果。

Share

覺得值得一看?分享給朋友。

以上為 AI 自動翻譯導讀。原文版權歸 DEV Community (Codex) 所有, 建議透過「閱讀原文」前往原始網站,以取得最完整資訊並支持原作者。

Newsletter

不用每天追,AI 重點每週寄給你

43 個來源、每 2 小時更新,太多看不完。電子報每週挑最值得看的幾則,附上 Max 的看法。

每週一封。Email 只用來寄電子報,每封信都能一鍵退訂。