저장소 하나에 앱 다섯 개가 들어가면서 작업 트리를 줄인 방법
문제 발생
모노레포가 커지면서 앱 하나만 손보는데도 작업 트리 전체가 따라왔습니다. 에디터 인덱싱과 파일 검색이 느려졌고, 관심 없는 디렉터리가 검색 결과를 채웠습니다.
원인 분석
Git의 기본은 "추적되는 모든 파일을 작업 트리에 둔다"입니다. 저장소가 커질수록 그 비용이 그대로 늘어납니다.
Git은 이 상황을 위한 기능을 제공합니다. 문서의 설명 그대로 sparse-checkout은 작업 트리를 추적 파일의 부분집합으로 줄이고, 동작 방식은 skip-worktree 비트입니다 — skip-worktree 비트가 설정되어 있고 파일이 작업 트리에 없으면 그 부재가 무시되며, Git은 그 파일들의 내용을 채우지 않습니다. 파일이 아주 많은 저장소에서 일부만 중요한 사용자에게 유용합니다.
기본 모드도 정해져 있습니다 — cone 모드가 기본이며, 포함할 디렉터리만 지정하면 됩니다. 지정한 디렉터리 아래 모든 경로가 포함되고, 앞선 상위 디렉터리(최상위 포함) 바로 아래의 경로들도 포함됩니다.
한 가지 분명히 해둘 것이 있습니다. 이것은 작업 트리의 문제를 해결하는 기능이지 저장소 크기를 줄이는 기능이 아닙니다 — 이력과 객체는 그대로 있습니다. 클론 자체를 가볍게 하려면 partial clone(--filter=blob:none)처럼 다른 도구가 필요합니다.
해결 방안
- 필요한 디렉터리만 켭니다.
git sparse-checkout init --cone
git sparse-checkout set apps/dev packages/db packages/auth최상위 파일(package.json, turbo.json 등)은 cone 모드가 자동으로 포함합니다.
- 되돌리기 쉽다는 점을 기억합니다. 잘못 좁혔으면 언제든 넓힐 수 있습니다.
git sparse-checkout add apps/web
git sparse-checkout disable # 전체 복원-
빌드가 필요한 범위를 확인합니다. 모노레포에서
packages/*를 빼면 타입 체크와 빌드가 깨집니다 — 앱 하나만 남기는 대신 그 앱이 의존하는 패키지를 함께 포함시켜야 합니다. -
CI에는 쓰지 않습니다. CI는 매번 새로 클론하고 전체를 빌드해야 합니다. 이 기능은 오래 사는 개발 머신을 위한 것입니다.
-
실험적 상태라는 경고를 인지합니다. 문서가 대문자로 적어둘 만큼 명시적입니다 — 이 명령은 실험적이며 동작이 앞으로 바뀔 가능성이 높습니다. 팀 표준으로 강제하기보다 각자 선택하게 두는 편이 안전합니다.
-
에디터 성능이 목적이라면 다른 방법도 봅니다. 검색 제외 설정이나 워크스페이스 분리로 충분한 경우가 많고, 그쪽이 Git 상태를 건드리지 않아 부작용이 적습니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.