Git은 스냅샷 모델을 사용해 커밋을 할 때마다 저장소의 내용 전체를 저장하는데요. 이렇게 전체 내용을 저장하면 사용하는 용량이 너무 많아지지 않을까요? Git은 이 문제를 어떻게 해결했을까요?
Git이 스냅샷 모델을 사용한다고 해서 매 커밋마다 모든 파일의 전체 복사본을 저장하는 것은 아닙니다. 실제로는 매우 효율적인 방식으로 변경된 파일만 저장하여 공간 낭비를 막고 있습니다.
Git은 파일 단위로 저장소를 관리하며, 커밋 시에는 변경된 파일만 새로 저장하고, 변경되지 않은 파일은 이전 커밋에서의 파일을 그대로 참조합니다. 즉, 실제로는 하드 링크(hard link) 혹은 내부적으로는 SHA-1 해시 기반의 객체 저장소를 활용해 중복된 데이터를 피하고 필요한 경우에만 새로운 객체(blob)를 생성합니다
.git/objects/18/25b1c2059127e1d327603a120b8e2227d56f73
.git/objects/27/489dc7b42616a0a66475f062b6205006fa960f
.git/objects/27/92ff01fc8fdfd1974f14ae3f4f7766ede75d33
.git/objects/4b/d4c19a7a0f8b581b835e73c8f457160f2d184a
.git/objects/4b/3264c2883acbc9ca1525bba63f940df74ffa4d
.git/objects/4b/beb0ab5ee200d2e3bb069b982e7f6a85cd8d6a
.git/objects/4b/8bbd00223b4bdfe85b030340a289ab421d52c1
.git/objects/pack/pack-d6ec1659bf6304bdbd1e7b217fa5bc8742220b0d.idx
.git/objects/pack/pack-4b89f39d60243f4a9687de51ab67fca53f91c5af.rev
.git/objects/pack/pack-ea1fe342bae7e05a23065fd2538d72779e8c0735.pack
.git/objects/pack/pack-4b89f39d60243f4a9687de51ab67fca53f91c5af.pack
.git/objects/pack/pack-d07b580b2226a789b3653c80278a80b0eea3cba7.idx
.git/objects/pack/pack-d6ec1659bf6304bdbd1e7b217fa5bc8742220b0d.pack
.git/objects/pack/pack-ea1fe342bae7e05a23065fd2538d72779e8c0735.idx
.git/objects/pack/pack-d07b580b2226a789b3653c80278a80b0eea3cba7.pack
.git/objects/pack/pack-d6ec1659bf6304bdbd1e7b217fa5bc8742220b0d.rev
.git/objects/pack/pack-4b89f39d60243f4a9687de51ab67fca53f91c5af.idx
.git/objects/pack/pack-d07b580b2226a789b3653c80278a80b0eea3cba7.rev
.git/objects/pack/pack-ea1fe342bae7e05a23065fd2538d72779e8c0735.rev
.git/objects/11/99fe3166cd69c98f9ac51cdf411af33725973b
.git/objects/11/cd42cce00705ea0ac05f27404a720c8950907e
.git/objects/11/17de233927ea762d9124fcf7f4e43b9313bb3e(.git/objects 폴더에 객체와 pack파일이 저장돼 있는 모습)
참고로 Git은 다음과 같은 방식으로 저장 용량을 최적화합니다:
- 콘텐츠 기반 저장: Git은 각 파일의 내용을 해시로 변환하여 관리합니다. 동일한 내용의 파일은 하나의 객체로만 저장되며, 중복 저장을 피합니다.
- 델타 압축 (delta compression): git gc 같은 명령어를 통해 Git은 유사한 객체끼리의 차이점만 저장하는 방식으로 내부 데이터를 압축합니다.
- 팩 파일 (pack file): 여러 Git 객체들을 하나의 파일로 묶어 저장하고, 내부적으로 최적화된 압축을 수행해 저장소 크기를 줄입니다.
Git은 기본적으로 스냅샷 모델을 저장 방식으로 사용하지만, 변경된 부분만 추적하고 저장하는 델타 모델을 병행함으로써 저장소 크기 문제를 효과적으로 관리합니다.
👨🏻💻Git 지식이 +1 늘었다. 다음 포스트에서 또 만나요 🚀😄
의견을 남겨주세요