3320 WorktreeCreate3320 WorktreeCreate
3321</h3>3321</h3>
3322 3322
3323在建立 worktree 時執行,無論是透過 `claude --worktree`、透過[使用 `isolation: "worktree"` 的 subagent](/docs/zh-TW/sub-agents#choose-the-subagent-scope),或是為 Claude Code 隔離在其自身 worktree 中的[背景工作階段](/docs/zh-TW/agent-view#how-file-edits-are-isolated)而建立。預設情況下,Claude Code 使用 `git worktree` 建立隔離的工作副本。設定 WorktreeCreate hook 會取代此預設的 git 行為,讓您可以使用不同的版本控制系統,例如 SVN、Perforce 或 Mercurial。3323在 Claude Code 建立 worktree 時執行,例如以下情況:
3324
3325* 您使用 `claude --worktree` 啟動工作階段
3326* Claude 在工作階段中建立 worktree,並使用 [`EnterWorktree`](/docs/zh-TW/tools-reference) 工具切換進入
3327* [subagent 使用 `isolation: "worktree"`](/docs/zh-TW/sub-agents#choose-the-subagent-scope)
3328* [工作流程](/docs/zh-TW/workflows#migrate-many-files-in-parallel)在其自己的 worktree 中執行 agent
3329* Claude Code 將[背景工作階段](/docs/zh-TW/agent-view#how-file-edits-are-isolated)隔離在其自己的 worktree 中
3330* `worktree` 模式下的 [`claude remote-control`](/docs/zh-TW/remote-control#start-a-remote-control-session) 在其自己的 worktree 中啟動工作階段
3331
3332當 Claude 透過 Bash 工具執行 `git worktree add` 而非呼叫 `EnterWorktree` 時,您的 WorktreeCreate hook 不會執行。若要檢查或封鎖該命令,請新增一個使用 `Bash` matcher 的 [`PreToolUse`](#pretooluse) hook。
3333
3334預設情況下,Claude Code 會使用 `git worktree` 建立隔離的工作副本。設定 WorktreeCreate hook 會取代該預設的 git 行為,讓您可以使用不同的版本控制系統,例如 SVN、Perforce 或 Mercurial。
3324 3335
3325由於 hook 會完全取代預設行為,因此不會處理 [`.worktreeinclude`](/docs/zh-TW/worktrees#copy-gitignored-files-into-worktrees)。如果需要將 `.env` 等本機設定檔複製到新的 worktree 中,請在 hook 腳本內執行此操作。3336由於 hook 會完全取代預設行為,因此不會處理 [`.worktreeinclude`](/docs/zh-TW/worktrees#copy-gitignored-files-into-worktrees)。如果需要將 `.env` 等本機設定檔複製到新的 worktree 中,請在 hook 腳本內執行此操作。
3326 3337
3389* 您退出互動式 [worktree 工作階段](/docs/zh-TW/worktrees#start-claude-in-a-worktree),並在 Claude Code 提示時選擇移除 worktree3400* 您退出互動式 [worktree 工作階段](/docs/zh-TW/worktrees#start-claude-in-a-worktree),並在 Claude Code 提示時選擇移除 worktree
3390* 您退出尚未[命名](/docs/zh-TW/sessions#name-your-sessions)的互動式 worktree 工作階段,Claude Code 未發現任何已變更或未追蹤的檔案,並在不提示您的情況下移除 worktree3401* 您退出尚未[命名](/docs/zh-TW/sessions#name-your-sessions)的互動式 worktree 工作階段,Claude Code 未發現任何已變更或未追蹤的檔案,並在不提示您的情況下移除 worktree
3391* 您刪除在該 worktree 中執行的[背景工作階段](/docs/zh-TW/agent-view#what-deleting-a-session-removes)3402* 您刪除在該 worktree 中執行的[背景工作階段](/docs/zh-TW/agent-view#what-deleting-a-session-removes)
3403* 您在工作階段中要求 Claude 結束並移除 worktree,而 Claude 使用 [`ExitWorktree`](/docs/zh-TW/tools-reference) 工具將其移除
3404* 由 [`claude remote-control`](/docs/zh-TW/remote-control#start-a-remote-control-session) 以 `worktree` 模式啟動的工作階段在未當機的情況下結束,且 Claude Code 在其 worktree 中未發現任何已變更或未追蹤的檔案,也沒有新的提交
3405* 您在 `claude remote-control` 以 `worktree` 模式啟動的工作階段仍在執行時停止它,且 Claude Code 在其 worktree 中未發現任何已變更或未追蹤的檔案,也沒有新的提交
3406
3407當 subagent 或工作流程 agent 完成時,Claude Code 會保留您的 WorktreeCreate hook 為其建立的 worktree,且不會執行您的 WorktreeRemove hook。工作完成後,請自行移除這些 worktree。
3408
3409對於 `ExitWorktree` 呼叫或 `claude remote-control` 清理,Claude Code 不會在您的 hook 執行前提示您。除非呼叫傳入 [`discard_changes: true`](/docs/zh-TW/agent-sdk/typescript#exitworktree),否則 `ExitWorktree` 會拒絕移除由 hook 建立的 worktree,這使得您的 hook 成為該途徑上的最後一道檢查。
3392 3410
3393Claude Code 使用 git 尋找已變更或未追蹤的檔案,因此在不是 git checkout 或不在 git checkout 內的 worktree 中,即使目錄包含未提交的工作,也不會找到任何檔案。請在 WorktreeRemove hook 刪除任何內容之前檢查這類工作。3411Claude Code 使用 git 尋找已變更或未追蹤的檔案,因此在不是 git checkout 或不在 git checkout 內的 worktree 中,即使目錄包含未提交的工作,也不會找到任何檔案。請在 WorktreeRemove hook 刪除任何內容之前檢查這類工作。
3394 3412
3395對於以 git 為基礎的 worktree,Claude Code 會使用 `git worktree remove` 自動處理清理。如果您設定了 WorktreeCreate hook,請搭配 WorktreeRemove hook 來控制其所建立之 worktree 的清理:3413對於基於 git 的 worktree,Claude Code 會使用 `git worktree remove` 自動處理清理。如果您設定了 WorktreeCreate hook,請搭配 WorktreeRemove hook 來控制清理:
3396 3414
3397* **沒有 WorktreeRemove hook**:當 Claude Code 在您退出 worktree 工作階段時移除 worktree,會改用對 WorktreeCreate hook 所回傳路徑執行 `git worktree remove --force`,因此 git 能辨識的 worktree 會被移除。git 無法辨識的 worktree(例如您的 hook 以非 git 版本控制系統建立的 worktree)會留在磁碟上。關於刪除[背景工作階段](/docs/zh-TW/agent-view#what-deleting-a-session-removes)時如何處理由 hook 建立的 worktree,請參閱 agent view 的刪除規則。3415* **沒有 WorktreeRemove hook**:對於結束時或透過 `ExitWorktree` 進行的移除,Claude Code 會改用 git;而在 `claude remote-control` 清理時則保留 worktree:
3416 * **您結束 worktree 工作階段,或 Claude 呼叫 `ExitWorktree`**:Claude Code 會以類似 `git worktree remove --force` 的方式移除 WorktreeCreate hook 回傳的路徑,因此 git 可識別的 worktree 會被移除。git 無法識別的 worktree,例如您的 hook 使用非 git 版本控制系統建立的 worktree,會保留在磁碟上。
3417 * **`claude remote-control` 清理工作階段的 worktree**:worktree 會保留在磁碟上,執行 `claude remote-control` 的終端機會顯示 `worktree removal failed, kept: <path>`。
3418 * **您刪除背景工作階段**:請參閱[刪除工作階段會移除的內容](/docs/zh-TW/agent-view#what-deleting-a-session-removes)。
3398* **Hook 以 0 退出**:worktree 視為已移除。Claude Code 不會從 hook 讀取任何其他內容,因此請確保您的 hook 已刪除該目錄。3419* **Hook 以 0 退出**:worktree 視為已移除。Claude Code 不會從 hook 讀取任何其他內容,因此請確保您的 hook 已刪除該目錄。
3399* **Hook 以非零值退出**:如果 `worktree_path` 上的目錄在之後仍然存在,移除就會失敗,且 worktree 會留在磁碟上,不會改用 git。在以非零值退出之前已刪除目錄的 hook 視為已移除。關於失敗如何回報,請參閱 [WorktreeRemove 輸入](#worktreeremove-input)。3420* **Hook 以非零值退出**:如果 `worktree_path` 上的目錄在之後仍然存在,移除就會失敗,且 worktree 會留在磁碟上,不會改用 git。在以非零值退出之前已刪除目錄的 hook 視為已移除。關於失敗如何回報,請參閱 [WorktreeRemove 輸入](#worktreeremove-input)。
3400 3421
3402 3423
3403Claude Code 會捨棄 WorktreeRemove hook 的 [JSON 輸出欄位](#json-output),例如 `systemMessage` 和 `continue`。3424Claude Code 會捨棄 WorktreeRemove hook 的 [JSON 輸出欄位](#json-output),例如 `systemMessage` 和 `continue`。
3404 3425
3405對於背景工作階段的刪除,Claude Code 會在執行 hook 之前驗證所儲存的 worktree 路徑,並拒絕本身為符號連結或經過儲存庫根目錄下符號連結的路徑。只有當您在 [agent view](/docs/zh-TW/agent-view#what-deleting-a-session-removes) 中確認刪除時,hook 才會針對仍包含檔案的 worktree 執行;對於這類 worktree,[`claude rm`](/docs/zh-TW/agent-view#manage-sessions-from-the-shell) 則會保留工作階段和 worktree。在 v2.1.216 之前,hook 會在未經這些檢查的情況下對所儲存的路徑執行。3426對於背景工作階段的刪除,Claude Code 會在執行 hook 之前驗證儲存的 worktree 路徑,並拒絕本身是符號連結或經過儲存庫根目錄以下符號連結的路徑。在該途徑上,只有當您在 [agent view](/docs/zh-TW/agent-view#what-deleting-a-session-removes) 中確認刪除時,hook 才會針對仍含有檔案的 worktree 執行;對於這類 worktree,[`claude rm`](/docs/zh-TW/agent-view#manage-sessions-from-the-shell) 則會保留工作階段和 worktree。在 v2.1.216 之前,hook 會在不進行這些檢查的情況下對儲存的路徑執行。
3406 3427
3407Claude Code 會將 WorktreeCreate 回傳的路徑作為 `worktree_path` 傳入 hook 輸入。此範例會讀取該路徑並移除目錄:3428Claude Code 會將 WorktreeCreate 回傳的路徑作為 `worktree_path` 傳入 hook 輸入。此範例會讀取該路徑並移除目錄:
3408 3429
3443 3464
3444* worktree 會留在磁碟上,且 hook 的命令和 stderr 會寫入[偵錯日誌](#debug-hooks)。3465* worktree 會留在磁碟上,且 hook 的命令和 stderr 會寫入[偵錯日誌](#debug-hooks)。
3445* 如果您當時正在刪除背景工作階段,該工作階段也會保留。[agent view](/docs/zh-TW/agent-view#what-deleting-a-session-removes) 中的拒絕訊息會回報 hook 的結束方式(例如 `exited 1`)、引用其 stderr 的開頭,並說明再次刪除工作階段是否仍會移除該目錄。3466* 如果您當時正在刪除背景工作階段,該工作階段也會保留。[agent view](/docs/zh-TW/agent-view#what-deleting-a-session-removes) 中的拒絕訊息會回報 hook 的結束方式(例如 `exited 1`)、引用其 stderr 的開頭,並說明再次刪除工作階段是否仍會移除該目錄。
3467* 如果 `claude remote-control` 正在清理工作階段的 worktree,執行它的終端機會顯示 `worktree removal failed, kept: <path>`。
3446 3468
3447<h3 id="precompact">3469<h3 id="precompact">
3448 PreCompact3470 PreCompact