생성 - git 현재 tag 확인




힘(Git)은 공간을 절약하고 동시에 빠른 속도를 유지합니까? (2)

방금 http://blip.tv/play/Aeu2CAI 에서 첫 번째 Git 튜토리얼을 보았습니다.

Git은 모든 파일의 모든 버전을 어떻게 저장합니까? 또한 코드의 최신 버전 만 저장하는 Subversion 보다 공간에서 더 경제적 일 수 있습니까?

압축을 사용하여이 작업을 수행 할 수 있다는 것을 알고 있지만 속도가 빨라지지만 Git은 훨씬 빠릅니다 (대부분의 작업이 오프라인 인 사실이 최대치를 얻지 만).

그래서 내 추측은

  • 힘내서 데이터를 광범위하게 압축합니다.
  • uncompression + worknetwork_fetch + work 보다 여전히 빠르기 때문에 여전히 빠릅니다.

나 맞아? 심지어 가까이?


Subversion에서 체크 아웃 된 소스보다 git clone (전체 저장소 + 체크 아웃)이 얼마나 작은 지 묻는 것으로 가정합니다. 아니면 뭔가 다른 것을 의미 했습니까?

이 질문은 의견에 답변되어 있습니다.

저장소 크기

먼저 체크 아웃 (작업 버전)에 따라 Subversion에서 해당 .svn 하위 디렉토리에 .svn 복사본 (마지막 버전)을 저장해야합니다. 원시 사본은 Subversion에 압축되지 않은 상태로 저장됩니다.

둘째, git은 저장소를 더 작게 만들기 위해 다음 기술을 사용합니다.

  • 각 파일 버전은 한 번만 저장됩니다. 즉, 10 개의 리비전 (10 개의 커밋)에 2 개의 서로 다른 버전의 파일이있는 경우 git은 10이 아닌 2 개의 버전 만 저장합니다.
  • 객체 (및 델타, 아래 참조)는 압축되어 저장됩니다. 프로그래밍에 사용되는 텍스트 파일은 실제로 잘 압축됩니다 (원본 크기의 약 60 % 또는 압축 크기의 40 % 감소)
  • 재 포장 후 객체는 다른 버전과의 차이점으로 분리 된 형식으로 저장됩니다. 추가적으로 git은 델타가 주로 삭제로 구성되는 방식으로 델타 체인을 주문하려고 시도합니다 (파일을 성숙시키는 일반적인 경우에 성사되는 순서입니다). IIRC 델타도 압축됩니다.

성능 (작업 속도)

첫째, 네트워크와 관련된 모든 작업은 로컬 작업보다 훨씬 느립니다. 예를 들어 작업 영역의 현재 상태를 다른 버전과 비교하거나 Subversion에서 네트워크 연결 및 네트워크 전송과 관련된 로그 (히스토리)를 얻고 Git에서 로컬 작업을 수행하는 경우 Subversion에서는 훨씬 느립니다 젠장. BTW. 이것은 Subversion과 Git 사이뿐만 아니라 (클라이언트 - 서버 워크 플로우를 사용하는) 중앙 집중 형 버전 제어 시스템과 피어 - 투 - 피어 워크 플로우를 사용하는 분산 버전 제어 시스템 간의 차이점입니다.

둘째로, 내가 올바르게 이해한다면 요즘의 한계는 CPU가 아니라 IO (디스크 접근)입니다. 따라서 압축으로 인해 디스크에서 적은 양의 데이터를 읽지 않아도 데이터를 압축 해제해야하는 손실을 극복 할 수 있습니다.

셋째, Git은 성능을 염두에두고 설계되었습니다 (예 : Git Wiki의 GitHistory 페이지 참조).

  • 인덱스는 파일에 대한 통계 정보를 저장하고, Git core.trustctime 파일을 사용하여 파일이 수정되었는지 여부를 결정하지 않고 결정합니다 (예 : core.trustctime 구성 변수 참조).
  • 최대 delta 깊이는 pack.depth 로 제한되어 있으며 기본값은 50입니다. Git은 액세스를 가속화하기 위해 델타 캐시를 가지고 있습니다. packfile의 객체에 빠르게 액세스 할 수 있도록 (생성 된) packfile 인덱스가 있습니다.
  • 힘내라 할 필요가없는 파일을 만지지 않도록주의를 기울인다. 예를 들어 브랜치를 변경하거나 다른 버전으로 되 감을 때 Git은 변경된 파일 만 업데이트합니다. 이 철학의 결과는 힘내는 최소한의 키워드 확장 만 지원한다는 것입니다.
  • 힘내는 외부 diff / 외부 병합 도구를 호출하는 대신 현재 diff 및 병합을 위해 LibXDiff 라이브러리의 자체 버전 을 사용합니다.
  • Git은 대기 시간 을 최소화하려고하는데 이는 좋은 인식 성능을 의미합니다. 예를 들어, 가능한 한 빨리 " git log "의 첫 번째 페이지를 출력하고, 전체 히스토리를 생성하는 데 더 많은 시간이 걸릴지라도 거의 즉시 볼 수 있습니다. 그것을 표시하기 전에 전체 히스토리가 생성 될 때까지 기다리지 않습니다.
  • 새로운 변경 사항을 가져올 때 Git은 서버와 공통점이있는 객체를 확인한 다음 씬 팩 파일 형태의 차이 만 보냅니다. 물론 Subversion은 업데이트 할 때 차이 만 보낼 수도 있습니다 (또는 기본적으로 가능).

나는 Git 해커가 아니며, Git이 더 나은 성능을 내기 위해 사용하는 몇 가지 기술과 기법을 놓친 것 같다. 그러나 Git은 메모리 매핑 파일과 같이 POSIX를 많이 사용하므로 MS Windows에서 이득이 클 수는 없습니다.


완전한 대답은 아니지만 AlBlue 의견 은 문제의 공간 관리 측면에 도움이 될 수 있습니다.

여기에 설명 할 가치가있는 몇 가지 점이 있습니다.

첫째, SVN 저장소보다 큰 Git 저장소를 가질 수 있습니다 . 나는 그것이 결코 사실이 아니라는 것을 암시하지 않았기를 바란다. 그러나 실제로는 Git 저장소가 동등한 SVN 저장소보다 디스크 공간을 덜 차지하는 경향이 있습니다.
당신이 인용 한 한 가지는 Apache의 단일 SVN 저장소입니다. 이것은 분명히 방대한 양입니다. 그러나 git.apache.org 를 살펴 git.apache.org 각 아파치 프로젝트는 자체 Git 저장소를 가지고 있음을 알 수있다. 정말 필요한 것은 like-for-like의 비교입니다. 즉, (abdera) SVN 프로젝트의 체크 아웃과 (abdera) Git 저장소의 복제본을 비교합니다 .

나는 git://git.apache.org/abdera.git 를 체크 아웃 할 수 있었다. 디스크에서 28.8Mb를 소비했습니다.
그런 다음 SVN 버전 http://svn.apache.org/repos/asf/abdera/java/trunk/ 을 체크하고 34.3Mb를 소비했습니다.
두 숫자는 RAM 공간에 별도로 마운트 된 파티션에서 가져온 것이고 인용 된 숫자는 디스크에서 가져온 바이트 수입니다.
du -sh 를 테스트 수단으로 사용하면 Git 체크 아웃은 11Mb이고 SVN 체크 아웃은 17Mb입니다.

Git 버전의 Apache Abdera를 사용하면 현재 릴리스까지의 모든 버전의 기록을 처리 할 수 ​​있습니다. SVN은 현재 체크 아웃 된 버전의 백업 만 가지게됩니다. 그러나 디스크 공간이 적습니다.

어떻게 물어볼 수 있니?

음, 한 가지는 SVN이 더 많은 파일을 생성합니다 . SVN 체크 아웃에는 2959 개의 파일이 있습니다. 해당 Git 저장소에는 845 개의 파일이 있습니다.

둘째, SVN 계층 구조의 각 수준에 .svn 폴더가있는 동안 자식 정보 저장소는 최상위 수준에 단일 .git 저장소 만 갖습니다 . 이것은 (다른 것들 사이에서) 한 디렉토리에서 다른 디렉토리로의 이름 변경이 SVN에서보다 Git에서 상대적으로 작은 영향을 준다는 것을 의미합니다.

셋째, Git은 데이터를 압축 된 객체로 저장하지만 SVN은 비 압축 된 사본으로 저장합니다 . .svn/text-base 디렉토리로 이동하면 (기본) 파일의 압축되지 않은 사본을 찾을 수 있습니다.
Git은 모든 파일 (실제로 모든 히스토리)을 팩 파일로 압축하는 메커니즘을 가지고있다. Abdera의 경우 .git/objects/pack/ 은 4.8MB 파일에 하나의 .pack 파일 (모든 히스토리 포함)을 가지고 있습니다.
따라서 리포지토리의 크기는이 경우 현재 체크 아웃 된 코드와 대략 동일한 크기입니다.하지만 항상 그렇게 될 것이라고는 기대하지 않습니다.

어쨌든, 당신은 역사가 현재 체크 아웃의 총 크기 이상으로 커질 수 있다고 옳습니다. 그러나 SVN이 작동하는 방식 때문에 차이를 만들기 위해서는 실제로 두 배 크기에 접근해야합니다. 그럼에도 불구하고, 디스크 공간 축소는 실제로 DVCS를 사용하는 주된 이유는 아닙니다. 어떤 점에서는 장점이지만, 사람들이 그것을 사용하는 이유는 아닙니다.

Git (및 Hg 및 다른 DVCS)은 (큰) 바이너리가 체크인되고 삭제 된 후 저장소에 계속 나타나고 공간이 차지 않을 때 문제가 발생합니다 (현재 위치가 아닐지라도). . 텍스트 압축은 이러한 종류의 텍스트 파일을 처리하지만 이진 파일은 더 많은 문제가됩니다. (Git 저장소의 내용을 업데이트 할 수있는 관리 명령이 있지만 CVS보다 약간 높은 오버 헤드 / 관리 비용이 필요하며 git filter-branch는 svnadmin dump/filter/load 와 비슷합니다.)

속도면에 관해서는 필자는 " 원격 조작으로 파괴하는 것이 얼마나 빠를까요? "라고 대답했습니다. Linus가 Google 프리젠 테이션에서 말했듯이 ( "네트워크와 관련된 모든 것이 성능을 죽일 것입니다")

Jakub Narębski 가 언급 한 GitBenchmark 문서 는 Subversion을 직접 다루지는 않지만 좋은 추가 기능입니다.
DVCS 성능에 대해 모니터링해야하는 작업 종류를 나열합니다.

다른 Git 벤치 마크는이 SO 질문에 언급되어 있습니다.





github