03-03 모노레포와 대용량 관리

큰 파일과 거대한 저장소를 다루는 법 — LFS, sparse/partial checkout, filter-repo, 모노레포 전략.


큰 파일과 거대한 저장소를 다루는 법 — LFS, sparse/partial checkout, filter-repo, 모노레포 전략.

목표: 저장소가 커져도 빠르고 가볍게 다루기


📁 Git LFS — 대용량 바이너리

Git은 텍스트 diff에 최적화돼 있어 큰 바이너리(이미지·영상·모델 파일)에 약하다. LFS(Large File Storage) 는 실제 파일을 별도 서버에 두고 저장소엔 포인터만 남긴다.

git lfs install                    # 1회 설정
git lfs track "*.psd"              # 추적할 패턴 지정 → .gitattributes에 기록
git lfs track "*.mp4" "*.bin"
git add .gitattributes
git add design.psd && git commit -m "feat: 디자인 추가"
git lfs ls-files                   # LFS로 관리되는 파일 목록
graph LR
    REPO["Git 저장소<br/>(포인터만)"] -.->|"실제 파일"| LFS["LFS 서버"]

[!tip] 언제 LFS? 자주 바뀌는 큰 바이너리, 100MB 넘는 파일(GitHub 제한). 다만 LFS 스토리지 비용·대역폭을 고려.


✂️ sparse-checkout — 일부 디렉토리만

거대한 모노레포에서 필요한 폴더만 작업 디렉토리에 받는다.

git sparse-checkout init --cone
git sparse-checkout set apps/web libs/ui   # 이 폴더들만 체크아웃
git sparse-checkout list
git sparse-checkout disable                # 해제(전체 복원)

저장소 히스토리는 그대로 두고 워킹 트리만 좁힌다 → 디스크·탐색 부담↓.


🌐 partial clone — 객체 지연 다운로드

git clone --filter=blob:none <url>     # blob을 필요할 때 받기(트리/커밋만 먼저)
git clone --filter=tree:0 <url>        # 더 공격적(트리도 지연)
git clone --depth 1 <url>              # 얕은 복제(최근 1커밋)

거대 저장소 초기 클론 시간을 크게 줄인다. CI에서 특히 유용.

방식받는 것용도
--depth N최근 N커밋CI 빌드
--filter=blob:none필요한 blob만대형 저장소 탐색
sparse-checkout일부 경로만모노레포 작업

🧹 git filter-repo — 히스토리 재작성

실수로 커밋한 비밀키·대용량 파일을 전체 히스토리에서 제거하거나 저장소를 분할할 때. (구식 filter-branch보다 빠르고 안전, 별도 설치 필요)

# 특정 파일을 모든 히스토리에서 제거
git filter-repo --invert-paths --path secrets.env

# 특정 폴더만 추출해 새 저장소로 분리
git filter-repo --path apps/web/

[!danger] 모든 해시가 바뀐다 히스토리 재작성은 전체 커밋 해시를 변경한다. 협업 저장소라면 모두에게 알리고 재클론하게 해야 하며, 강제 push가 필요하다. 유출된 비밀은 제거 후에도 반드시 무효화(rotate) 할 것 — 이미 복제됐을 수 있다.


🏢 모노레포 전략

여러 프로젝트를 한 저장소에서 관리.

장점단점
코드 공유·일괄 리팩토링 쉬움저장소 비대화
원자적 커밋(여러 프로젝트 동시)CI가 전체를 돌면 느림
단일 버전·의존성 관리도구 필요(Nx, Turborepo, Bazel)

대응 도구: sparse-checkout + partial clone(클론 경량화), 영향받은 프로젝트만 빌드(Nx/Turborepo의 affected), CODEOWNERS로 영역 분리.


📋 체크리스트

  • LFS로 대용량 바이너리 관리
  • sparse-checkout로 일부 경로만
  • partial/shallow clone으로 경량화
  • filter-repo로 비밀·대용량 제거
  • 히스토리 재작성의 위험과 절차
  • 모노레포 장단점·도구

🔗 관련 노트

  • 03-02-bisect-worktree-submodule — 이전
  • 03-04-Git-훅과-자동화 — 다음
  • 02-04-gitignore와-파일-관리 — 바이너리·attributes
  • 03-05-트러블슈팅과-재해-복구 — 비밀 유출 대응

마지막 업데이트: 2026-06-02