본문으로 건너뛰기
개발 머꼬
개발 노트Git
hohyeon.dev14

저장소 하나에 앱 다섯 개가 들어가면서 작업 트리를 줄인 방법

  • #Engineering Note
  • #Git

문제 발생

모노레포가 커지면서 앱 하나만 손보는데도 작업 트리 전체가 따라왔습니다. 에디터 인덱싱과 파일 검색이 느려졌고, 관심 없는 디렉터리가 검색 결과를 채웠습니다.

원인 분석

Git의 기본은 "추적되는 모든 파일을 작업 트리에 둔다"입니다. 저장소가 커질수록 그 비용이 그대로 늘어납니다.

Git은 이 상황을 위한 기능을 제공합니다. 문서의 설명 그대로 sparse-checkout은 작업 트리를 추적 파일의 부분집합으로 줄이고, 동작 방식은 skip-worktree 비트입니다 — skip-worktree 비트가 설정되어 있고 파일이 작업 트리에 없으면 그 부재가 무시되며, Git은 그 파일들의 내용을 채우지 않습니다. 파일이 아주 많은 저장소에서 일부만 중요한 사용자에게 유용합니다.

기본 모드도 정해져 있습니다 — cone 모드가 기본이며, 포함할 디렉터리만 지정하면 됩니다. 지정한 디렉터리 아래 모든 경로가 포함되고, 앞선 상위 디렉터리(최상위 포함) 바로 아래의 경로들도 포함됩니다.

한 가지 분명히 해둘 것이 있습니다. 이것은 작업 트리의 문제를 해결하는 기능이지 저장소 크기를 줄이는 기능이 아닙니다 — 이력과 객체는 그대로 있습니다. 클론 자체를 가볍게 하려면 partial clone(--filter=blob:none)처럼 다른 도구가 필요합니다.

해결 방안

  1. 필요한 디렉터리만 켭니다.
git sparse-checkout init --cone
git sparse-checkout set apps/dev packages/db packages/auth

최상위 파일(package.json, turbo.json 등)은 cone 모드가 자동으로 포함합니다.

  1. 되돌리기 쉽다는 점을 기억합니다. 잘못 좁혔으면 언제든 넓힐 수 있습니다.
git sparse-checkout add apps/web
git sparse-checkout disable      # 전체 복원
  1. 빌드가 필요한 범위를 확인합니다. 모노레포에서 packages/*를 빼면 타입 체크와 빌드가 깨집니다 — 앱 하나만 남기는 대신 그 앱이 의존하는 패키지를 함께 포함시켜야 합니다.

  2. CI에는 쓰지 않습니다. CI는 매번 새로 클론하고 전체를 빌드해야 합니다. 이 기능은 오래 사는 개발 머신을 위한 것입니다.

  3. 실험적 상태라는 경고를 인지합니다. 문서가 대문자로 적어둘 만큼 명시적입니다 — 이 명령은 실험적이며 동작이 앞으로 바뀔 가능성이 높습니다. 팀 표준으로 강제하기보다 각자 선택하게 두는 편이 안전합니다.

  4. 에디터 성능이 목적이라면 다른 방법도 봅니다. 검색 제외 설정이나 워크스페이스 분리로 충분한 경우가 많고, 그쪽이 Git 상태를 건드리지 않아 부작용이 적습니다.

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.