- Git 프로젝트가 최근 공식적으로 대용량 파일 관리 문제를 직접 해결하기 시작함
- Git LFS는 사용자에게 여러 가지 비용, 벤더 종속성 등을 유발하는 임시방편임
- 최근 partial clone 기능으로 Git 자체만으로 대부분의 LFS 역할을 대체할 수 있게 됨
- 앞으로는 large object promisor라는 새로운 솔루션도 공식 Git에 통합 준비 중임
- 이러한 변화로 대용량 파일 관리의 궁극적인 해법이 외부 확장이 아닌 Git 자체로 귀결될 전망임
Git의 대용량 파일 문제와 변화
- 만약 Git의 가장 큰 적(Nemesis)은 바로 대용량 파일
- 대용량 파일은 Git 저장소를 비대화시키고,
git clone속도를 저하시키며, 대다수 호스팅 환경에도 악영향을 줌
Git LFS의 등장과 한계
- 2015년 GitHub는 Git LFS를 출시해 대용량 파일 문제를 우회했음
- 하지만 Git LFS 자체가 새로운 복잡성과 저장 비용을 추가함
- Git 커뮤니티는 조용히 대용량 파일 근본 문제를 고민해 왔고, 최근 Git의 공식 릴리즈에서 LFS 없이 대용량 파일을 관리할 새로운 방향성이 제시됨
오늘 당장 가능한 방법: Git LFS를 partial clone으로 대체
-
partial clone의 원리
- Git LFS: 대용량 파일은 저장소 밖에 두고, 필요한 파일만 다운로드해 작업하는 구조임
- Git partial clone(2017년 도입):
--filter옵션으로 원하는 크기 이상의 blob을 제외하고 복제- 필요할 때만 해당 대용량 파일만 서버에서 내려받음
Partial clone을 사용하면 Clone 및 Fetch 중에 [대용량 바이너리 자산]을 미리 다운로드하지 않아도 되므로 다운로드 시간과 디스크 사용량을 줄일 수 있음
-
partial clone과 LFS의 공통점
- 1. 체크아웃 용량 최소화: 최신 버전만 받고 전체 파일 히스토리는 생략함
- 2. 빠른 복제: 대용량 파일 전송이 없으니 clone 속도가 빠름
- 3. 빠른 세팅: shallow clone과 달리 프로젝트 전체 히스토리 접근 가능함
-
partial clone 활용 예시
- 대용량 PNG 파일의 히스토리가 많은 repo 복제 속도 및 디스크 차지 실례:
- 일반 clone시 거의 4분, 1.3GB 공간 차지
- partial clone 및 100KB blob 제한 적용시 6초 만에 복제, 49MB 차지
- 원본 대비 복제 속도 97% 개선, 체크아웃 크기 96% 축소
- 대용량 PNG 파일의 히스토리가 많은 repo 복제 속도 및 디스크 차지 실례:
-
partial clone의 한계
- 필터링한 데이터가 필요할 경우(예:
git diff,git blame,git checkout), Git이 서버에 파일 요청함 - 이는 Git LFS와 동일한 특징임
- 실무에서는 바이너리 파일에 blame 할 일은 드묾
- 필터링한 데이터가 필요할 경우(예:
Git LFS의 문제점
- 높은 벤더 종속성: GitHub 구현체는 자체 서버만 지원, 요금 부과 및 종속성 초래
- 비용 문제: 50GB 저장시 GitHub LFS는 연 $40, Amazon S3는 $13
- 되돌리기 힘듦: 한번 LFS로 전환시, 히스토리 재작성 없이 원상복구 불가
- 지속적 세팅 비용: 모든 협업자가 LFS 설치 필수, 설치 안 하면 파일 대신 메타데이터 파일(혼란 유발)
앞으로의 전망: Large Object Promisor
- 대용량 파일은 호스팅 플랫폼(GitHub, GitLab)에서도 비용적 문제를 일으킴
- Git LFS는 대용량 파일을 CDN으로 오프로딩하면서 서버 비용을 줄임
-
Large Object Promisor란?
- 올해 초, Git은 large object promisor라는 기능을 공식적으로 머지함
- 이 기능은 LFS와 유사하게 서버 쪽의 저장소 부하를 줄이지만, 사용자 복잡성은 크게 줄임
이 노력은 서버 측의 작업, 특히 이미 이진 형식으로 압축된 대용량 블롭의 작업을 개선하는 데 목적이 있음
Git LFS의 대안이 되는 솔루션임
– Large Object Promisors, git-scm.com
-
동작 원리
- 1. 사용자가 대용량 파일을 Git 호스트에 push
- 2. 호스트가 백엔드 promisor에 대용량 파일 오프로딩 처리
- 3. clone시 Git 호스트가 클라이언트에 promisor 정보 제공
- 4. 클라이언트는 필요시 해당 promisor에서 자동으로 대용량 파일 받음
-
현재 도입 현황과 과제
- 대용량 promisor는 아직 개발 중이며, 2025년 3월 일부 코드가 Git에 머지됨
- GitLab 등에서 추가 구현 및 미해결 이슈 논의 진행 중
- 대중적 도입까지는 아직 시간이 필요함
- 당분간은 대용량 파일 저장에 Git LFS 의존 불가피
- promisor가 보급되면 GitHub에도 100MB 넘는 파일 업로드가 가능해질 전망
결론: Git의 대용량 파일 미래는 Git
- Git 프로젝트는 여러분을 대신해 대용량 파일 문제를 끊임없이 고민 중임
- 현재는 여전히 Git LFS 사용이 필요함
- 그러나 partial clone과 large object promisors가 발전하면서 Git LFS는 점차 불필요해지고, 머지않아 대용량 파일을 Git만으로 손쉽게 관리할 수 있는 시대가 도래할 것임
- 미래에는 Git에 MP3 라이브러리를 넣겠다는 생각만이 대용량 활용을 가로막는 마지막 장애가 될 것