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