5

Git は-l、ローカル ファイル システムからクローンが要求されたときに、おそらくクローンを高速化し、ディスク領域を節約することを想定しています。このタイプのクローンにはどのような影響がありますか? リポジトリを 2 回クローンしてから一方にコミットすると、変更はもう一方のクローンに表示されますか? Git が書き込み時にコピーすることに注意しているかどうか疑問に思っています。元のリポジトリが読み取り専用の場合、クローンに問題が発生しますか?

4

1 に答える 1

5

git cloneマンページには次のように記載されてい-lます:

複製元のリポジトリがローカル マシン上にある場合、このフラグは通常の「git 対応」トランスポート メカニズムをバイパスし、オブジェクトと参照ディレクトリの下にある HEAD とすべてのコピーを作成してリポジトリを複製します。.git/objects/ ディレクトリの下のファイルは、可能な限りスペースを節約するためにハードリンクされています。

これは、すべての Git オブジェクトのハードリンクを取得することを意味します。これらのオブジェクトはとにかく不変であり、Git は一度作成されるとそれらを更新しないため、実際の影響はありません。HEADおよび他のシンボリック参照の実際のコピーも取得するため、1 つのリポジトリでの変更は他のリポジトリでは見られません。変更をコミットすると、その下にいくつかの新しいオブジェクトが作成され、最新のコミット (新しく作成されたオブジェクトの 1 つ) を指すように参照が更新されます。既存のオブジェクトは更新されないため、ハードリンクについて心配する必要はありません。.git/objectsHEAD

マンページには、興味深いかもしれない1つの意味が記載されています。

ハードリンクの代わりにコピーを強制するには (リポジトリのバックアップを作成しようとしている場合は望ましいかもしれません)、それでも通常の "git 対応" トランスポート メカニズムを回避するには、 --no-hardlinks を使用できます。

ハードリンクの欠点は、ディスク上の同じ実際の inode を参照することです。そのため、1 つの Git オブジェクトが破損すると、それにハードリンクするすべてのローカル クローンのオブジェクトが破損します。ハードリンクがなければ、すべてのオブジェクトの実際のバックアップ コピーが作成されます。

于 2012-10-23T20:39:18.637 に答える