2

たとえば、次の内容のファイルがあるとします。

1111
2222
3333

次に、次のように変更します。

1111
2222
4444
3333

Git は新しいバージョンの新しいファイルを生成しますか? 混乱しています。新しいファイルを作成すると、リポジトリ全体のサイズが急速に大きくなりますか?

別の考えでは、Git は新しいファイルを作成せず、行を追加する場所または削除する場所を保存し、新しい行の内容を保存するだけです。

どちらが正しいですか ?

4

3 に答える 3

4

RCS や CVS などの古いソース管理システムの多くは、特にファイルのバージョン間の違いを保存します。たとえば、特定のソース ファイルの情報は、最新バージョンの全文と、以前のバージョンを生成するための「指示」を含む形式でリポジトリに格納される場合があります。

Git は、少なくとも概念的には、すべてのファイルの各バージョンのコンテンツ全体をリポジトリに保存します。格納に使用される名前はコンテンツのハッシュによって決定されるため、同一のファイルのコピーを 1 つだけ格納することで、スペースを節約します。

明らかに、それがすべての話である場合、Git リポジトリは非常に急速に非常に大きくなります。しかし、Git は保存されたオブジェクトを自動的にパック (圧縮) します。率直に言って、すべての詳細を知っているわけではありませんが、ストレージ スペースを最小限に抑えることと、任意のバージョンをすばやく再作成できるようにすることの両方でうまく機能しています。

たとえば、Git ソース自体は Git リポジトリに格納されており、おそらく何千もの個別のオブジェクトが含まれています。すべてのファイルのすべてのバージョンは、ディレクトリの下に保存され、.git/objects/pack現在、次のものが含まれています (リストは私のシステムのクローンのものです)。

$ ls -l .git/objects/pack
total 48900
-r--r--r-- 1 kst kst  4196172 Mar 20 15:44 pack-0e69de7b7728ad0fde80423ded259dbff7760016.idx
-r--r--r-- 1 kst kst 36698393 Mar 20 15:44 pack-0e69de7b7728ad0fde80423ded259dbff7760016.pack
-r--r--r-- 1 kst kst   125896 Jun 30 22:17 pack-2848a675d3c196391f06cc7cdd6cebf67fb7119e.idx
-r--r--r-- 1 kst kst  3570770 Jun 30 22:17 pack-2848a675d3c196391f06cc7cdd6cebf67fb7119e.pack
-r--r--r-- 1 kst kst   178452 May 16 08:22 pack-bfd75de39dff6ac03adcc775f7b5715480b54637.idx
-r--r--r-- 1 kst kst  5292998 May 16 08:22 pack-bfd75de39dff6ac03adcc775f7b5715480b54637.pack

以前のシステム (少なくとも私が使用した以前のシステム) と比較した Git の違いは、大まかに言えば、リポジトリ内のすべてのファイルのすべてのバージョンが完全に保存されますが、圧縮は別のレイヤーによって提供されることです。 .

于 2013-07-01T05:24:09.363 に答える
1

通常のファイルの場合、git はそれらをblobオブジェクトとして保存し、git はファイルの各バージョンを個別blobの として保存します。そのため、別々に保管されています。これには、一部のコミットを非常に高速にチェックアウトできるという利点があります (バックトラックしてすべてのパッチ操作を実行する代わりに)。

リポジトリ サイズの問題に対して、git はオブジェクト パッキング メカニズムを提供し、データを自動的に (または必要に応じて) 圧縮します。ほとんどの場合、これは大きな問題ではありません。

于 2013-07-01T04:11:11.720 に答える
1

Git はプロジェクト全体でコンテンツの変更を保存するだけです。漸進的な違い。任意の時点で、以前のファイルと同じファイルは、その以前のファイルの内容を記述するオブジェクトへのポインタとして記録されます。ファイルの内容にハッシュを使用して、ファイルに変更があったことを認識し、以前のバージョンとの一致を見つけるため、同じものを複数回保存する必要がありません。

また、すべての変更とその関係を説明する単純なデータベースもあります。

リポジトリの編成方法に関するドキュメントを次に示します。

https://www.kernel.org/pub/software/scm/git/docs/gitrepository-layout.html


スペースの節約に関する追加の注意: Git の大幅なスペースの節約は、同じファイルを 2 回保存しないことが判明しました。他のコンテンツ マネージャーは、Git のようにファイル バージョンへのポインターを使用しないため、プロジェクト バージョンの存続期間にわたって大幅な節約になります。プロジェクトのバージョンを移動すると、いくつかのファイルのみが変更されます。

于 2013-07-01T03:56:13.197 に答える