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


15

ここでのいくつかの議論と、DVCSリポジトリが中央のカウンターパートとほぼ同じ、またはそれより少ないスペースを使用することについて読んだことがあります。私はそれを見逃したかもしれませんが、私はそれがなぜであるかの良い説明を見つけていません。知ってる?



1
ありません、ありがとうございます!したがって、zlibを使用した圧縮と、可能な場合はオブジェクトをパックファイルとして保存するという2つの答えがあることを理解しています。Mozillaのサンプルも素晴らしいです!
アレックスフロレスク

1
@アレックスいいえ、それは主な理由を逃しています。SVNは完全なスナップショットを保存し、GitとMercurialはHEADリビジョンと差分のみを保存します。従来の圧縮を使用すると、約60〜80%の圧縮率が得られます。diffを使用すると、最大99%が得られます。しかし、これらの数字は私の尻から引き出されています。ただし、傾向は同じです。
コンラッドルドルフ

@KonradRudolph、それはパックファイルとは何ですか?
アレックスフロレスク

@Alexそうではありません。私の知る限り、packfileは複数のファイルをさらに1つにパックしています。これは必ずしも関連しているわけではありません。
コンラッドルドルフ

回答:


18

私自身の経験から、次の記述はすべて真実です。

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

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

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

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

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

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


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

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


1
gitはofficeファイルの完全なコピーを保存していると確信していますか?バイナリ差分も保存すると思います。もちろん、これらの種類のファイルの実際の問題は、それらが多くの場合既に圧縮されているため、小さな変更でファイル全体が変更される可能性があることです
jk。

2
私よりもはるかによく知っている人に(メールで)尋ねたところ、その答えが私の答えに含まれるようになりました。
mliebelt

6
Gitは、テキストファイルとバイナリファイルを、ストレージに関してあらゆる点でまったく同じように扱います。緩いオブジェクトとパックされたオブジェクトは、テキストとバイナリとは無関係です。バイナリファイルがテキストファイルよりもはるかに大きな差分になることが多いのは、多くのバイナリ形式(すべての新しいoffice形式を含む)が既に圧縮されているためです。これはgitとsubversionにとっても同様に懸念事項ですが、subversionはサーバーでのペナルティしか受けませんが、gitはどこでも使用できます。
ジャン・ヒューデック

4
緩いオブジェクトとパックされたオブジェクトは、テキストとバイナリとは関係ありません。バイナリdiffを見つけるのが難しい作業の償却です。速度はgitの重要な機能であるため、通常の操作では、gitは新しいデータのみを圧縮し、リポジトリに格納します。これは緩いオブジェクトです。呼び出すgit gcか、大量のルーズオブジェクトを蓄積するように要求するときよりも、それらをデルタ圧縮するための適切な候補を見つけ(gitは以前のバージョンとは異なることがあります)、デルタを「パック」に保存し、ルーズオブジェクトを削除します。
ジャン・ヒューデック

3
実世界の数字に興味がある人のために:まったく同じレポから2つの作業コピーを比較しました。SVN作業コピーは約2.9 GB、GIT作業コピーは約0.8 GBです。
JensG 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.