我正在開發一款名為 Offrun 的 Mac 應用程式。本文中提及的所有內容都適用於純粹的 Git 和代理程式 CLI 工具,文末會簡短介紹 Offrun。
問題在於,當您在同一個儲存庫中同時執行 Claude Code 和 Codex 時,很快就會遇到三個問題:兩個代理程式會編輯相同的檔案,導致其中一個代理程式的變更破壞另一個的工作樹。其中一個帳號達到用量限制,導致工作中途停止。要求撰寫差異的代理程式自行審查,往往會錯過它在撰寫時就已錯過的問題。
本文探討在單一程式碼儲存庫中平行執行 Claude Code 和 Codex 時遇到的挑戰,例如檔案衝突、用量限制和審查盲點。作者提出解決方案,包括為每個代理建立獨立的 Git worktree、利用不同代理進行程式碼審查,以及透過多個帳號來規避用量限制,以提升開發效率。

我正在開發一款名為 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
在 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)起草的,其中的命令都經過執行以檢查結果。
覺得值得一看?分享給朋友。
以上為 AI 自動翻譯導讀。原文版權歸 DEV Community (Codex) 所有, 建議透過「閱讀原文」前往原始網站,以取得最完整資訊並支持原作者。
43 個來源、每 2 小時更新,太多看不完。電子報每週挑最值得看的幾則,附上 Max 的看法。