카테고리 · 6편
Git worktree·멀티세션
한 저장소에서 여러 브랜치를 동시에 굴릴 때 생기는 문제들. worktree 운영 규칙과 사고 사례.
한 저장소에 체크아웃이 여러 개면 "설정 파일이 두 벌", "포트가 하나", "gitignore 된 파일은 안 따라옴" 같은 상태가 만들어집니다. 이 분류는 그때 처음 드러나는 문제들입니다.
원인을 끝내 못 찾은 사고 하나도 그대로 뒀습니다. 해결책 대신 손실을 줄이는 운용 방식만 적혀 있습니다.
기본 브랜치를 바꿨는데 새 worktree 가 옛 브랜치에서 분기될 때
로컬 clone 의 refs/remotes/origin/HEAD 는 clone 시점에 한 번만 설정되고 이후 자동 갱신되지 않는다. origin/HEAD 를 보고 분기하는 도구는 전부 옛 기본 브랜치를 쓴다.
PR 에 Closes #N 을 써도 이슈가 안 닫힌다면 — base 가 기본 브랜치인지 본다
GitHub 의 closing keyword 는 PR 의 base 가 저장소 기본 브랜치일 때만 동작한다. develop 기반 워크플로로 옮기는 중이면 조용히 무시된다.
dev 서버가 돌고 있는데 worktree 디렉터리가 통째로 사라졌다
실행 중이던 vite 프로세스의 cwd 가 (deleted) 로 바뀌고 worktree list 에서 항목 자체가 소멸했다. 원인은 특정하지 못했고, 복구도 불가능했다. 운용 원칙으로 대응한다.
worktree 마다 .env 를 다시 만들지 않기 — post-checkout 훅으로 심볼릭 링크
git worktree add 는 tracked 파일만 체크아웃하므로 gitignore 된 .env 는 절대 따라오지 않는다. 래퍼 함수 대신 post-checkout 훅을 쓰면 어떤 방식으로 만들든 자동으로 연결된다.
multiple candidate TSConfigRootDirs — 저장소 안에 worktree 를 만들면 ESLint 가 전부 터진다
repo 내부에 git worktree 를 두면 tsconfig.json 이 두 벌 존재해 typescript-eslint 의 tsconfigRootDir 자동탐지가 후보를 결정하지 못한다. 208개 파일이 전부 파싱에러.
worktree 여러 개를 동시에 굴리는 dev 서버 전략 — pm2 를 버린 이유
pm2 는 프로세스 이름이 전역이라 같은 프로젝트의 worktree 를 동시에 띄울 수 없고, 시작 시점 PATH 를 박아둬서 fnm 과 충돌한다. 경로 해시 기반 결정적 포트 스크립트로 교체했다.