リポジトリの最初のクローン中に、gitは最初にオブジェクト(十分に明らかです)を受け取り、次に「デルタの解決」とほぼ同じ時間を費やします。クローンのこの段階で実際に何が起こっていますか?
リポジトリの最初のクローン中に、gitは最初にオブジェクト(十分に明らかです)を受け取り、次に「デルタの解決」とほぼ同じ時間を費やします。クローンのこの段階で実際に何が起こっていますか?
回答:
Gitは差分エンコーディングを使用して、一部のオブジェクトをパックファイルに格納します。しかし、あなたはすべての単一の変更を再生するにはしたくない、これまでのGitもうまくとして格納されたファイルの内容の臨時のスナップショットを持っているので、現在のバージョンを取得するために、与えられたファイルに。「デルタの解決」は、それらすべての一貫性を維持するためのステップです。
ここの章です。この程度の協議こと、オンラインで利用可能であるプロGitの著書の「Gitの内部構造」セクションからは。
git gc
またはGitが必要と判断するたびに)、Gitはすべての「緩い」ファイルをパックファイルに圧縮してスペースを節約し、そのパックファイルへのインデックスファイルが作成されます。そのため、zlibは独自のデルタアルゴリズムで圧縮しますが、Gitはデルタエンコーディングを使用して以前のバージョンを格納します。最も一般的で頻繁なアクセスは最新バージョンであるため、スナップショットとして保存されます。
の段階は次のgit clone
とおりです。
"Resolving deltas"は、パックファイル( "git index-pack")のインデックスを作成する第2段階で表示されるメッセージです。
パックのファイルがないではない、彼らにのみオブジェクトの内容を実際のオブジェクトIDを持っています。そのため、オブジェクトIDを特定するために、gitはパック内の各オブジェクトの解凍+ SHA1を実行してオブジェクトIDを生成し、それをインデックスファイルに書き込む必要があります。
パックファイル内のオブジェクトは、デルタ、つまり他のオブジェクトに対して行われる一連の変更として保存できます。この場合、gitはベースオブジェクトを取得し、コマンドを適用して結果をSHA1する必要があります。基本オブジェクト自体は、一連のデルタコマンドを適用することによって派生する必要がある場合があります。(クローンの場合でも、ベースオブジェクトは既に検出されていますが、メモリにキャッシュされる製造済みオブジェクトの数には制限があります)。
要約すると、「デルタの解決」段階では、repoデータベース全体の圧縮解除とチェックサム計算が行われますが、驚くほど長い時間はかかりません。おそらく、SHA1の解凍と計算には、deltaコマンドを適用するよりも時間がかかります。
後続のフェッチの場合、受信したパックファイルには、受信gitがすでに持っていると予想される他のオブジェクトへの参照(デルタオブジェクトベースとして)が含まれている可能性があります。この場合、受け取り側のgitは実際に、受け取ったパックファイルを書き換えて、そのような参照オブジェクトを含めます。これにより、保存されているパックファイルはすべて自給自足になります。これは、メッセージ「デルタを解決しています」が発生した場所である可能性があります。
アンバーは、Mercurialなどが使用するオブジェクトモデルを説明しているようです。Gitは、オブジェクトの後続のバージョン間の差分を保存するのではなく、毎回オブジェクトの完全なスナップショットを保存します。次に、これらのスナップショットをデルタ圧縮を使用して圧縮し、履歴のどこに存在するかに関係なく、使用する適切なデルタを見つけようとします。