3321 WorktreeCreate3321 WorktreeCreate
3322</h3>3322</h3>
3323 3323
3324`claude --worktree`, [`isolation: "worktree"`를 사용하는 서브에이전트](/docs/ko/sub-agents#choose-the-subagent-scope), 또는 Claude Code가 자체 worktree에 격리하는 [백그라운드 세션](/docs/ko/agent-view#how-file-edits-are-isolated) 등 worktree가 생성될 때 실행됩니다. 기본적으로 Claude Code는 `git worktree`로 격리된 작업 사본을 만듭니다. WorktreeCreate 훅을 구성하면 이 기본 git 동작을 대체하므로 SVN, Perforce, Mercurial과 같은 다른 버전 관리 시스템을 사용할 수 있습니다.3324Claude Code가 다음과 같은 경우에 worktree를 생성할 때 실행됩니다.
3325
3326* `claude --worktree`로 세션을 시작하는 경우
3327* Claude가 세션 중에 worktree를 생성하고 [`EnterWorktree`](/docs/ko/tools-reference) 도구로 전환하는 경우
3328* [서브에이전트가 `isolation: "worktree"`를 사용](/docs/ko/sub-agents#choose-the-subagent-scope)하는 경우
3329* [워크플로](/docs/ko/workflows#migrate-many-files-in-parallel)가 자체 worktree에서 에이전트를 실행하는 경우
3330* Claude Code가 [백그라운드 세션](/docs/ko/agent-view#how-file-edits-are-isolated)을 자체 worktree에 격리하는 경우
3331* `worktree` 모드의 [`claude remote-control`](/docs/ko/remote-control#start-a-remote-control-session)이 자체 worktree에서 세션을 시작하는 경우
3332
3333Claude가 `EnterWorktree`를 호출하지 않고 Bash 도구를 통해 `git worktree add`를 실행하는 경우에는 WorktreeCreate 훅이 실행되지 않습니다. 해당 명령을 검사하거나 차단하려면 `Bash` matcher를 사용하는 [`PreToolUse`](#pretooluse) 훅을 추가하십시오.
3334
3335기본적으로 Claude Code는 `git worktree`로 격리된 작업 사본을 생성합니다. WorktreeCreate 훅을 구성하면 이 기본 git 동작이 대체되므로 SVN, Perforce, Mercurial 같은 다른 버전 관리 시스템을 사용할 수 있습니다.
3325 3336
3326훅이 기본 동작을 완전히 대체하므로 [`.worktreeinclude`](/docs/ko/worktrees#copy-gitignored-files-into-worktrees)는 처리되지 않습니다. `.env`와 같은 로컬 설정 파일을 새 워크트리로 복사해야 한다면 훅 스크립트 안에서 복사하십시오.3337훅이 기본 동작을 완전히 대체하므로 [`.worktreeinclude`](/docs/ko/worktrees#copy-gitignored-files-into-worktrees)는 처리되지 않습니다. `.env`와 같은 로컬 설정 파일을 새 워크트리로 복사해야 한다면 훅 스크립트 안에서 복사하십시오.
3327 3338
3390* 대화형 [worktree 세션](/docs/ko/worktrees#start-claude-in-a-worktree)을 종료하고 Claude Code가 확인을 요청할 때 worktree 제거를 선택하는 경우3401* 대화형 [worktree 세션](/docs/ko/worktrees#start-claude-in-a-worktree)을 종료하고 Claude Code가 확인을 요청할 때 worktree 제거를 선택하는 경우
3391* [이름을 지정](/docs/ko/sessions#name-your-sessions)하지 않은 대화형 worktree 세션을 종료하고, Claude Code가 변경되거나 추적되지 않는 파일을 찾지 못해 묻지 않고 worktree를 제거하는 경우3402* [이름을 지정](/docs/ko/sessions#name-your-sessions)하지 않은 대화형 worktree 세션을 종료하고, Claude Code가 변경되거나 추적되지 않는 파일을 찾지 못해 묻지 않고 worktree를 제거하는 경우
3392* worktree에서 실행되는 [백그라운드 세션](/docs/ko/agent-view#what-deleting-a-session-removes)을 삭제하는 경우3403* worktree에서 실행되는 [백그라운드 세션](/docs/ko/agent-view#what-deleting-a-session-removes)을 삭제하는 경우
3404* 세션 중에 Claude에게 종료하고 worktree를 제거하도록 요청하여, Claude가 [`ExitWorktree`](/docs/ko/tools-reference) 도구로 이를 제거하는 경우
3405* [`claude remote-control`](/docs/ko/remote-control#start-a-remote-control-session)이 `worktree` 모드로 시작한 세션이 충돌 없이 종료되고, Claude Code가 해당 worktree에서 변경되었거나 추적되지 않은 파일 및 새 커밋을 찾지 못하는 경우
3406* `worktree` 모드로 시작된 세션이 아직 실행 중일 때 `claude remote-control`을 중지하고, Claude Code가 해당 worktree에서 변경되었거나 추적되지 않은 파일 및 새 커밋을 찾지 못하는 경우
3407
3408서브에이전트나 워크플로 에이전트가 완료되면, Claude Code는 WorktreeCreate 훅이 해당 에이전트를 위해 만든 worktree를 유지하며 WorktreeRemove 훅을 실행하지 않습니다. 작업이 끝나면 해당 워크트리를 직접 제거하십시오.
3409
3410Claude Code는 `ExitWorktree` 호출이나 `claude remote-control` 정리 시에는 훅이 실행되기 전에 확인을 요청하지 않습니다. `ExitWorktree`는 호출에 [`discard_changes: true`](/docs/ko/agent-sdk/typescript#exitworktree)가 전달되지 않는 한 훅이 생성한 worktree의 제거를 거부하므로, 해당 경로에서는 훅이 마지막 검사 역할을 합니다.
3393 3411
3394Claude Code는 git을 사용해 변경되거나 추적되지 않는 파일을 찾으므로, git 체크아웃이 아니거나 git 체크아웃 내부에 있지 않은 worktree에서는 디렉터리에 커밋되지 않은 작업이 있더라도 아무것도 찾지 못합니다. WorktreeRemove 훅에서 무언가를 삭제하기 전에 그러한 작업이 있는지 확인하십시오.3412Claude Code는 git을 사용해 변경되거나 추적되지 않는 파일을 찾으므로, git 체크아웃이 아니거나 git 체크아웃 내부에 있지 않은 worktree에서는 디렉터리에 커밋되지 않은 작업이 있더라도 아무것도 찾지 못합니다. WorktreeRemove 훅에서 무언가를 삭제하기 전에 그러한 작업이 있는지 확인하십시오.
3395 3413
3396git 기반 worktree의 경우 Claude Code는 `git worktree remove`로 정리를 자동 처리합니다. WorktreeCreate 훅을 구성했다면 WorktreeRemove 훅과 함께 사용하여 해당 훅이 생성한 워크트리의 정리를 제어하십시오.3414git 기반 worktree의 경우 Claude Code는 `git worktree remove`로 정리를 자동으로 처리합니다. WorktreeCreate 훅을 구성했다면, 정리를 제어하기 위해 WorktreeRemove 훅과 함께 사용하십시오.
3397 3415
3398* **WorktreeRemove 훅이 없는 경우**: worktree 세션을 종료하면서 Claude Code가 worktree를 제거할 때, WorktreeCreate 훅이 반환한 경로에 대해 `git worktree remove --force`로 폴백하므로 git이 인식하는 worktree는 제거됩니다. git이 인식하지 못하는 worktree, 예를 들어 훅이 git이 아닌 버전 관리 시스템으로 생성한 worktree는 디스크에 남습니다. [백그라운드 세션](/docs/ko/agent-view#what-deleting-a-session-removes)을 삭제할 때 훅으로 생성된 worktree가 어떻게 처리되는지는 에이전트 뷰의 삭제 규칙을 참조하십시오.3416* **WorktreeRemove 훅이 없는 경우**: 종료 시 또는 `ExitWorktree`를 통한 제거에서는 Claude Code가 git으로 폴백하고, `claude remote-control`이 정리할 때는 worktree를 유지합니다.
3417 * **worktree 세션을 종료하거나 Claude가 `ExitWorktree`를 호출하는 경우**: Claude Code는 WorktreeCreate 훅이 반환한 경로를 `git worktree remove --force`와 같은 방식으로 제거하므로, git이 인식하는 worktree는 제거됩니다. git이 인식하지 못하는 worktree(예: 훅이 git이 아닌 버전 관리 시스템으로 생성한 worktree)는 디스크에 남습니다.
3418 * **`claude remote-control`이 세션의 worktree를 정리하는 경우**: worktree는 디스크에 남으며, `claude remote-control`을 실행 중인 터미널에 `worktree removal failed, kept: <path>`가 표시됩니다.
3419 * **백그라운드 세션을 삭제하는 경우**: [세션 삭제 시 제거되는 항목](/docs/ko/agent-view#what-deleting-a-session-removes)을 참조하십시오.
3399* **훅이 0으로 종료되는 경우**: worktree가 제거된 것으로 간주됩니다. Claude Code는 훅에서 다른 내용을 읽지 않으므로 훅이 디렉터리를 삭제했는지 확인하십시오.3420* **훅이 0으로 종료되는 경우**: worktree가 제거된 것으로 간주됩니다. Claude Code는 훅에서 다른 내용을 읽지 않으므로 훅이 디렉터리를 삭제했는지 확인하십시오.
3400* **훅이 0이 아닌 코드로 종료되는 경우**: 이후에도 `worktree_path`의 디렉터리가 여전히 존재하면 제거가 실패하고, git 폴백 없이 worktree가 디스크에 남습니다. 0이 아닌 코드로 종료하기 전에 디렉터리를 삭제한 훅은 제거된 것으로 간주됩니다. 실패가 보고되는 방식은 [WorktreeRemove 입력](#worktreeremove-input)을 참조하십시오.3421* **훅이 0이 아닌 코드로 종료되는 경우**: 이후에도 `worktree_path`의 디렉터리가 여전히 존재하면 제거가 실패하고, git 폴백 없이 worktree가 디스크에 남습니다. 0이 아닌 코드로 종료하기 전에 디렉터리를 삭제한 훅은 제거된 것으로 간주됩니다. 실패가 보고되는 방식은 [WorktreeRemove 입력](#worktreeremove-input)을 참조하십시오.
3401 3422
3403 3424
3404Claude Code는 WorktreeRemove 훅의 `systemMessage`, `continue` 등 [JSON 출력 필드](#json-output)를 버립니다.3425Claude Code는 WorktreeRemove 훅의 `systemMessage`, `continue` 등 [JSON 출력 필드](#json-output)를 버립니다.
3405 3426
3406백그라운드 세션 삭제의 경우 Claude Code는 훅을 실행하기 전에 저장된 worktree 경로를 검증하며, 심볼릭 링크이거나 저장소 루트 아래의 심볼릭 링크를 거치는 경로를 거부합니다. 여전히 파일이 포함된 worktree에 대해서는 [에이전트 뷰](/docs/ko/agent-view#what-deleting-a-session-removes)에서 삭제를 확인한 경우에만 훅이 실행되며, 이러한 worktree에 대해 [`claude rm`](/docs/ko/agent-view#manage-sessions-from-the-shell)은 대신 세션과 worktree를 유지합니다. v2.1.216 이전에는 이러한 검사 없이 저장된 경로에 대해 훅이 실행되었습니다.3427백그라운드 세션 삭제 시 Claude Code는 훅을 실행하기 전에 저장된 worktree 경로를 확인하고, 심볼릭 링크이거나 저장소 루트 아래의 심볼릭 링크를 거치는 경로를 거부합니다. 이 경로에서는 [에이전트 뷰](/docs/ko/agent-view#what-deleting-a-session-removes)에서 삭제를 확인한 경우에만 아직 파일이 있는 worktree에 대해 훅이 실행됩니다. 그러한 worktree의 경우 [`claude rm`](/docs/ko/agent-view#manage-sessions-from-the-shell)은 세션과 worktree를 대신 유지합니다. v2.1.216 이전에는 이러한 검사 없이 저장된 경로에서 훅이 실행되었습니다.
3407 3428
3408Claude Code는 WorktreeCreate가 반환한 경로를 훅 입력의 `worktree_path`로 전달합니다. 다음 예시는 해당 경로를 읽고 디렉터리를 제거합니다.3429Claude Code는 WorktreeCreate가 반환한 경로를 훅 입력의 `worktree_path`로 전달합니다. 다음 예시는 해당 경로를 읽고 디렉터리를 제거합니다.
3409 3430
3444 3465
3445* worktree는 디스크에 남고, 훅의 명령과 stderr는 [디버그 로그](#debug-hooks)에 기록됩니다.3466* worktree는 디스크에 남고, 훅의 명령과 stderr는 [디버그 로그](#debug-hooks)에 기록됩니다.
3446* 백그라운드 세션을 삭제하던 중이었다면 세션도 유지됩니다. [에이전트 뷰](/docs/ko/agent-view#what-deleting-a-session-removes)의 거부 메시지는 `exited 1`과 같이 훅이 어떻게 종료되었는지 보고하고, stderr의 앞부분을 인용하며, 세션을 다시 삭제하면 디렉터리가 어쨌든 제거되는지 여부를 알려 줍니다.3467* 백그라운드 세션을 삭제하던 중이었다면 세션도 유지됩니다. [에이전트 뷰](/docs/ko/agent-view#what-deleting-a-session-removes)의 거부 메시지는 `exited 1`과 같이 훅이 어떻게 종료되었는지 보고하고, stderr의 앞부분을 인용하며, 세션을 다시 삭제하면 디렉터리가 어쨌든 제거되는지 여부를 알려 줍니다.
3468* `claude remote-control`이 세션의 worktree를 정리하던 중이었다면, 이를 실행 중인 터미널에 `worktree removal failed, kept: <path>`가 표시됩니다.
3447 3469
3448<h3 id="precompact">3470<h3 id="precompact">
3449 PreCompact3471 PreCompact