Files
tea-sdlc/docs/adr/0001-以集中式雜湊路徑的-worktree-隔離平行工作包.md
T

2.3 KiB
Raw Blame History

status
status
accepted

以集中式雜湊路徑的 worktree 隔離平行工作包

/sdlc-feat 與 /sdlc-fix 一律在獨立的 worktree 上工作,而非在同一個工作目錄上切換分支;worktree 集中於 ~/.tea-sdlc/worktrees/{hash},hash 為正規化後 owner/repo/分支名 的 sha256 前 12 碼。這麼做的核心理由是 agent 非同步讀檔:它可能在分支被切走之後才去讀,而它不會察覺自己讀到的是別顆工作包的程式碼,產出看似合理卻接錯上下文——前兩種常見損耗(未提交變更擋路、建置產物跨分支混淆)人會當場發現,這一種不會,所以規則是「一律」而非「有衝突才用」。

Considered Options

  • repo 內的 .worktrees/:未被忽略時會出現在目標專案的 git status,而要它不出現就得改目標專案的忽略設定——本 plugin 明文不修改目標專案的檔案。
  • 目標 repo 的兄弟目錄:不污染 repo,但會在使用者的專案父目錄長出一堆目錄,而那個目錄結構屬於使用者,不屬於這個工具。
  • 把分支名的斜線攤平成 - 當目錄名:feat/a-b/main 與 feat/a/b/main 會撞成同一個名字,而既有的分支命名規則({類型}/{需求描述}/{功能描述})恰好讓這種形狀有機會出現。
  • 目錄名加可讀後綴:被否決,因為 git worktree list 本來就會把分支名印在路徑旁邊,可讀性缺口有限。

Consequences

  • 路徑由工作包純函式推導,不需要任何本機對照表或狀態檔,因此換機器或換 agent 之後推導結果相同;推導不到就重建,這正是「不寫入任何本機狀態檔」這條既有約束所要求的接手方式。
  • git worktree add 仍會在目標 repo 的 .git/worktrees/ 底下寫中繼資料。這是 git 的機制,無法避免。「不修改目標專案的檔案」指的是專案內容檔,不含 git 自身的內部中繼資料——這條界線是本決策劃定的。
  • 目錄名是雜湊,光看路徑字串認不出是哪顆工作包。緩解來自兩處:git worktree list 印出分支名,PR 檢查腳本回報推導出的路徑。
  • 正規化(小寫、去前後空白)是必要的:沒有它,同一棵 worktree 會因輸入大小寫或多一個空白而被推導成兩個不同路徑。