Git / Mercurial 리포지토리에서 공간을 적게 사용하는 이유는 무엇입니까?


15

DVCS 리포지토리가 중앙 집중식 카운터 공간과 동일하거나 적은 공간을 사용하도록 여기와 SO에 대한 몇 가지 토론을 읽었습니다. 나는 그것을 놓쳤을 수도 있지만 그 이유에 대한 좋은 설명을 찾지 못했습니다. 누구 알아?



1
나는, 감사합니다! 따라서 zlib를 사용하여 압축하고 가능한 경우 객체를 팩 파일로 저장하는 두 가지 답변이 있음을 이해합니다. Mozilla의 예제도 훌륭합니다!
Alex Florescu

1
@Alex 아니요, 주된 이유가 없습니다. SVN은 완전한 스냅 샷을 저장하고 Git과 Mercurial은 HEAD 개정과 diff 만 저장합니다. 일반적인 압축을 사용하면 약 60-80 %의 압축률을 얻을 수 있습니다. diff를 사용하면 99 %까지 줄 수 있습니다. 그래도이 숫자는 내 엉덩이에서 빠져 나옵니다. 실수는 다를 수 있습니다. 경향은 같은 생각 일 것이다.
Konrad Rudolph

@ KonradRudolph, 그게 무슨 팩 파일입니까?
Alex Florescu

@Alex 아닙니다. 지금까지 내가 packfile 추가로 알고로 포장 하나에 여러 파일을. 반드시 관련이있는 것은 아닙니다.
Konrad Rudolph

답변:


18

내 경험으로는 다음과 같은 내용이 모두 해당됩니다.

  • Git은 텍스트 파일을 저장하는 데 매우 효율적이며 변경된 파일 만 저장합니다. 따라서 SVN과 Git을 비교하여 저장소 크기를 비교할 때 저장소 크기가 비슷하거나 Git에 대한 작은 이점도 있습니다.
  • MS 워드, 엑셀, 파워 포인트 등과 같이 많은 양의 파일이 오피스 파일 인 리포지토리의 크기를 비교하면 이것은 완전히 잘못된 것입니다. 여기서 Git은 완전한 사본도 저장합니다. 즉, Powerpoint 슬라이드 스택에서 10 번의 작은 변경으로 10 개의 완전한 사본이 생성됩니다. 여기서 Subversion은 이진 diff 만 저장하며 100 배 더 작을 수 있습니다.

체크 아웃 위치 (Git과 자체 저장소)를 비교하면 이야기가 완전히 다릅니다.

  • 서브 버전은 각 파일에 대해 완전한 사본을 저장하므로 체크 아웃 위치의 크기는 일반적으로 파일 크기의 2 배입니다.
  • Git은 리포지토리의 전체 히스토리를 로컬로 저장하므로 히스토리 크기에 따라 서브 버전 체크 아웃 사본보다 작거나 훨씬 클 수 있습니다.

다운 또는 업로드해야하는 바이트의 양을 비교하면 다시 다릅니다.

  • Subversion은 차이 만 보내기 때문에 일반적으로 적은 바이트를 보내거나 받아야합니다. 커밋 및 업데이트 할 때마다 수행해야합니다.
  • Git은 전체 저장소를 (처음에) 가져와야하며 텍스트 파일과 다르지 않지만 이진 파일과 다를 수있는 완전한 파일 (압축?)을 보냅니다. 그리고 깃은 원격 저장소로 무언가를 밀거나 당길 때만 그렇게합니다.

결국 사과를 오렌지와 비교하고 Subversion 또는 Git으로 수행하려는 작업에 따라 결과가 다를 수 있습니다.


@ jk는 완전한 사본 또는 이진 diff에 대해 질문했지만 그 질문에 대답 할 수 없었습니다. 나는 최근에 방문한 Jax 2012에서 Git 워크샵을 한 Matthew McCullough에게 물었다. 그는 Git의 내부 작업에 대한 자세한 요점 을 설명하는 데 시간이 많이 걸렸습니다. 따라서 그렇습니다. 압축이 진행 중이며 Microsoft Office 파일로 실험을 수행하고 그의 요점과 비교할 것입니다. 그러나 압축은 전체 파일에서 수행됩니다. 그의 요지에서 인용 :

느슨한 객체는 각 커밋시 압축되지만 델타가 아닌 형식으로 작성됩니다.


1
git store에서 완전한 오피스 파일 사본을 저장 하시겠습니까? 바이너리 diff도 저장한다고 생각합니다. 작은 변화는 변화에 전체 파일 발생할 수 있으므로 이러한 파일 종류와 물론 정말로 문제로 종종 이미 압축되어있다
JK합니다.

2
나보다 더 많은 것을 알고있는 사람에게 (이메일로) 물었고 그의 대답을 내 대답에 포함시킬 것입니다.
mliebelt

6
Git은 텍스트와 바이너리 파일을 저장과 관련하여 모든면에서 동일하게 취급합니다. 느슨한 개체와 압축 된 개체는 텍스트와 이진과 관련이 없습니다. 이진 파일이 텍스트 파일보다 훨씬 더 큰 차이를 일으키는 이유는 많은 이진 형식 (모든 새 사무실 형식 포함)이 이미 압축되어 있기 때문에 내용의 작은 변경조차도 결과 이진 블로 브에서 크게 변경되기 때문입니다. 이것은 git과 subversion에도 똑같이 중요하지만 subversion은 서버에서만 페널티를받는 반면 git은 어디에나 있습니다.
Jan Hudec

4
느슨한 개체와 압축 된 개체는 텍스트와 이진과 아무 관련이 없습니다. 이진 diff를 찾는 어려운 작업이 상각됩니다. 속도는 git의 중요한 기능이므로 정기적으로 작동하는 동안 git은 새 데이터를 압축하여 리포지토리에서 때립니다. 이것은 느슨한 물체입니다. 호출 git gc하거나 느슨한 객체가 너무 많으면 요청할 때보 다 델타 압축 할 수있는 좋은 후보를 찾고 (git은 이전 버전과 다른 것으로 비교할 수 있음) 델타를 "팩"에 저장하고 느슨한 객체를 제거합니다.
얀 후덱

3
실제 숫자에 관심이있는 사람들을 위해 : 나는 정확히 동일한 리포지토리에서 두 개의 작업 사본을 비교했습니다. SVN 작업 복사본은 약 2,9GB이고 GIT 작업 복사본은 약 0.8GB입니다.
JensG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.