web-dev-qa-db-ja.com

Git / Mercurialリポジトリが使用するスペースが少ないのはなぜですか?

私はここでいくつかの議論とSO DVCSリポジトリが中央の対応するものとほぼ同じかそれより少ないスペースを使用することを読みました。私はそれを逃したかもしれませんが、私は見つかりませんでした理由はよくわかります誰か知っていますか

15
Alex Florescu

私自身の経験から、次の記述はすべて当てはまります。

  • Gitはテキストファイルの保存に非常に効率がよく、変更されたこれらのファイルのみを保存します。そのため、リポジトリのサイズを比較するためにSVNとGitの比較を行う場合、それらは類似している可能性があります。
  • これは、かなりの量のファイルがオフィスファイル(MS Word、Excel、PowerPointなど)であるリポジトリのサイズを比較すると、完全に間違っています。ここでGitは完全なコピーも保存します。つまり、PowerPointスライドスタックで10の小さな変更を行うと、10の完全なコピーが作成されます。Subversionはバイナリの差分のみを保存するため、100分の1になる場合があります。

チェックアウトの場所(それ自体がGitのリポジトリです)を比較すると、ストーリーはまったく異なります。

  • Subversionは各ファイルの完全なコピーを保存するため、チェックアウト場所のサイズは通常、ファイル自体のサイズの2倍です。
  • Gitはリポジトリの完全な履歴をローカルに保存するため、履歴のサイズに応じて、Subversionチェックアウトコピーの履歴よりも小さい場合や非常に大きい場合があります。

ダウンまたはアップロードする必要があるバイトの量を比較すると、再び異なります。

  • Subversionは送信するバイト数が少ないため、通常は送信または受信するバイト数が少なくなります。すべてのコミットと更新でそれを行わなければなりません。
  • Gitは(最初に)リポジトリ全体を取得してから、完全なファイル(圧縮された?)を送信する必要があります。これは、テキストファイルではそれほど変わらないが、バイナリファイルでは異なる場合があります。そしてはい、Gitは、リモートリポジトリに何かをプッシュまたはプルしたときにのみそれを行います。

したがって、最後にリンゴとオレンジを比較し、SubversionまたはGitで何をしたいかによって、結果が異なる場合があります。


@jkは完全なコピーまたはバイナリ差分について尋ねましたが、その質問には答えられませんでした。最近、私が訪れたJax 2012でGitワークショップを行ったMatthew McCulloughに尋ねました。彼は 詳細なGist Gitの内部動作で説明するのに時間をかけました(彼に多くのことを感謝します)。だから、はい、そこでは圧縮が機能しています(そして、私はMicrosoft Officeファイルでも実験を行い、それを彼のGistと比較します)が、圧縮はファイル全体に対して行われます。彼の要旨から引用:

緩いオブジェクトは圧縮されて書き込まれますが、各コミットの時点ではデルタ形式ではありません。

18
mliebelt