英語 ▾ トピック ▾ 最新バージョン ▾ gitpacking は2.46.0で最終更新されました

名前

gitpacking - Gitにおけるパッキングに関する高度な概念

概要

gitpacking

説明

このドキュメントは、Gitにおけるパッキングに関するいくつかの高度な概念を説明することを目的としています。

多くの概念は現在、git-pack-objects[1]git-repack[1]などの様々なGitコマンドのマニュアルページ、およびgitformat-pack[5]、そして`Documentation/technical`ツリーの一部に散らばって記載されています。

Gitにおけるパッキングには、このドキュメントでは扱われていない多くの側面があり、それらは前述の領域に存在しています。時間が経てば、これらの散らばった情報はこのドキュメントに統合されるかもしれません。

擬似マージビットマップ

擬似マージビットマップは実験的な機能と見なされており、そのため設定や多くのアイデアは変更される可能性があります。

背景

到達可能性ビットマップは、トラバーサルの開始点となる1つ以上のオンディスクに保存されたビットマップがある場合に最も効率的です。このため、Gitは参照の先端にあるコミットのビットマップを保存することを好みます。これは、トラバーサルがそれらのポイントから始まる傾向があるためです。

しかし、多数の参照がある場合、*すべての*参照先端にビットマップを保存するのは現実的ではありません。スペースを取り、それらすべてのビットマップを単にOR演算するだけでもコストがかかります。

これに対処する方法の1つは、参照の*グループ*を表すビットマップを作成することです。トラバーサルがグループ全体について問い合わせる場合、個々の参照を考慮する代わりに、この単一のビットマップを使用できます。これらのビットマップは、すべてのコミットの仮想的なマージで到達可能なオブジェクトのセットを表すため、擬似マージビットマップと呼びます。

概要

「擬似マージビットマップ」は、以下のようにビットマップのペアを指すために使用されます

コミットビットマップ

擬似マージの「マージ」ビットマップ(後述)に含まれるコミットのセットを、設定されたビットが記述するビットマップ。

マージビットマップ

擬似マージの「コミット」ビットマップ(前述)にあるコミットのセットに対する到達可能性閉包を、設定されたビットが記述するビットマップ。コミットビットマップで記述されたのと同じ親のセットを持つoctopus mergeに対しても、同一のビットマップが生成されます。

擬似マージビットマップは、特定の擬似マージに関するすべてのコミットがトラバーサルのいずれかの側に直接(`HAVES`または`WANTS`の一部として明示的に要求する)、または間接的に(埋め込みトラバーサル中に遭遇する)リストされている場合に、ビットマップトラバーサルを高速化できます。

ユースケース

例えば、多数のコミットを含む擬似マージビットマップが存在し、それらすべてが特定のビットマップトラバーサルクエリの`WANTS`セクションにリストされているとします。擬似マージビットマップが有効になっている場合、ビットマップ機構は、クエリのいずれかの側で要求されたオブジェクトのサブセットを満たす擬似マージが存在することを迅速に判断できます。その後、EWAH圧縮されたビットマップを伸長し、結果のビットマップに`OR`演算で結合できます。対照的に、擬似マージビットマップがない場合、潜在的に多数の個々のビットマップに対して伸長と`OR`演算のステップを繰り返す必要があり、その分、より多くの時間がかかる可能性があります。

擬似マージのもう一つの利点は、(a)多数の参照、(b)劣悪なビットマップカバレッジ、(c)深くネストされたツリーが組み合わさり、埋め込みトラバーサルが比較的高価になる場合に発生します。例えば、各タグを個別にビットマップ化するのが非現実的なほど多数のタグが存在するとします。擬似マージビットマップがない場合、例えば`git rev-list --use-bitmap-index --count --objects --tags`の結果を計算するには、大量の埋め込みトラバーサルが必要となるでしょう。しかし、それらのタグの大量が擬似マージビットマップにまとめて格納されている場合、ビットマップ機構は、それらすべてのタグから到達可能なオブジェクトの結合のみに関心があるという事実を利用し、クエリにはるかに高速に応答できます。

設定

参照の先端は、2つの基準に従って異なる擬似マージグループにグループ化されます。参照名は定義された擬似マージパターンに1つ以上一致し、オプションでそのパターン内の1つ以上のキャプチャグループがグループをさらに分割します。

グループ内では、コミットはその経過時間に応じて「安定」または「不安定」と見なされる場合があります。これらは、それぞれ`bitmapPseudoMerge.<name>.stableThreshold`および`bitmapPseudoMerge.<name>.threshold`の設定値を設定することで調整されます。

すべての安定したコミットは、同じサイズ(`bitmapPseudoMerge.<name>.stableSize`)の擬似マージにグループ化されます。`stableSize`設定が例えば100に設定されている場合、`stableThreshold`値よりも古い最初の100コミット(コミッター日付でソート)が1つのグループを形成し、次の100コミットが別のグループを形成するといった形になります。

不安定なコミットの中で、擬似マージ機構は、新しいコミットが小さなグループに現れるのとは対照的に、古いコミットを大きなグループに結合しようとします。これは、先端コミットが古い参照の方が、先端コミットが新しい参照よりも異なるコミットを指すように変更される可能性が低いというヒューリスティックに基づいています。

グループのサイズはべき乗則減衰関数によって決定され、減衰パラメータは`f(n) = C*n^(-k/100)`の「k」にほぼ対応します。ここで`f(n)`はn番目の擬似マージグループのサイズを表します。サンプルレートは、対象となるコミットの何パーセントが候補と見なされるかを制御します。しきい値パラメータは最小経過時間を示し(擬似マージグループに最新すぎるコミットが含まれるのを避け、有効性が低下しないようにするため)、"maxMerges"パラメータは個々のグループにおける擬似マージコミット数の上限を設定します。

「安定」関連パラメータは、「安定」な擬似マージグループを制御します。これらは、設定された「安定しきい値」よりも古い固定数のコミットで構成され、年齢順に「stableSize」のチャンクにまとめられます。

擬似マージの正確な設定は以下の通りです

`bitmapPseudoMerge.*`の設定オプションは実験的と見なされており、将来的に変更されるか完全に削除される可能性があります。擬似マージビットマップ機能の詳細については、gitpacking[7]の「擬似マージビットマップ」セクションを参照してください。
bitmapPseudoMerge.<name>.pattern

参照名を照合するために使用される正規表現。このパターンに一致する参照(および`bitmapPseudoMerge.<name>.sampleRate`や`bitmapPseudoMerge.<name>.threshold`のような以下の基準を満たすもの)が指すコミットは、擬似マージビットマップへの含める候補と見なされます。

コミットは、特定のコミットを指す参照が、拡張正規表現であるパターンに一致するかどうかに基づいて、擬似マージグループにグループ化されます。

擬似マージグループ内では、パターン内のキャプチャグループに基づいて、コミットをさらにサブグループにグループ化することができます。これらのサブグループは、正規表現からのキャプチャグループをハイフン「-」で連結することによって形成されます。

例えば、パターンが`refs/tags/`の場合、すべてのタグ(以下の基準を満たすもの)は同じ擬似マージグループの候補と見なされます。しかし、パターンが`refs/remotes/([0-9])+/tags/`である場合、異なるリモートからのタグは、リモート番号に基づいて別々の擬似マージグループにグループ化されます。

bitmapPseudoMerge.<name>.decay

連続する擬似マージビットマップグループのサイズが減少する割合を決定します。非負である必要があります。このパラメータは、関数`f(n) = C * n^-k`における`k`と考えることができ、ここで`f(n)`はn番目のグループのサイズです。

減衰率を`0`に設定すると、すべてのグループが同じサイズになります。減衰率を`1`に設定すると、n番目のグループが初期グループの`1/n`のサイズになります。減衰率の値が高いほど、連続するグループは急速に縮小します。デフォルトは`1`です。

すべてのグループが同じサイズの場合、新しいコミットを指す参照が古いコミットを指す参照よりも頻繁に更新される可能性が高いため、新しいコミットを含むグループは以前のグループよりも使用頻度が低くなる可能性があります。

bitmapPseudoMerge.<name>.sampleRate

不安定な擬似マージビットマップへの含める候補として選択される、非ビットマップ化されたコミット(参照先端にあるもの)の割合を決定します。`0`から`1`(両端を含む)の間である必要があります。デフォルトは`1`です。

bitmapPseudoMerge.<name>.threshold

不安定な擬似マージビットマップへの含める候補となる、非ビットマップ化されたコミット(前述の参照先端にあるもの)の最小経過時間を決定します。デフォルトは`1.week.ago`です。

bitmapPseudoMerge.<name>.maxMerges

コミットが分散される擬似マージコミットの最大数を決定します。

パターンにキャプチャグループが含まれていない擬似マージグループの場合、この設定は正規表現に一致するすべてのコミットに適用されます。1つ以上のキャプチャグループを持つパターンでは、この設定は各個別のキャプチャグループに適用されます。

例えば、キャプチャグループが`refs/tags/`の場合、この設定はすべてのタグを最大`maxMerges`の擬似マージコミットに分散させます。しかし、キャプチャグループが例えば`refs/remotes/([0-9]+)/tags/`の場合、この設定は各リモートのタグのセットに個別に適用されます。

非負である必要があります。デフォルト値は64です。

bitmapPseudoMerge.<name>.stableThreshold

安定した擬似マージビットマップの候補となるコミット(前述の参照先端にあるもの、ただし安定したコミットはビットマップでカバーされていても候補と見なされます)の最小経過時間を決定します。デフォルトは`1.month.ago`です。

このしきい値をより小さい値(例:1.week.ago)に設定すると、より多くの安定したグループが生成されますが(これは一度限りの生成コストを課します)、これらのグループは時間が経つにつれて古くなる可能性があります。より大きな値を使用すると、その逆のペナルティが発生します(より有用な安定したグループが少なくなる)。

bitmapPseudoMerge.<name>.stableSize

安定した擬似マージビットマップのサイズ(コミット数)を決定します。デフォルトは`512`です。

多数の参照を持つリポジトリがあり、`refs/`名前空間のビットマップカバレッジを向上させるための、ごく基本的な擬似マージビットマップ設定が必要だとします。次のような設定から始めることができます

[bitmapPseudoMerge "all"]
	pattern = "refs/"
	threshold = now
	stableThreshold = never
	sampleRate = 100
	maxMerges = 64

これにより、すべての参照に対して、それらの経過時間に関わらず擬似マージビットマップが作成され、それらは64個の擬似マージコミットにグループ化されます。

擬似マージコミットを生成する際にタグとブランチを区別したい場合は、代わりに次のようにキャプチャグループを含むパターンを定義します

[bitmapPseudoMerge "all"]
	pattern = "refs/(heads/tags)/"

代わりに、フォークネットワークリポジトリで作業しているとします。各フォークは数値IDで指定され、その参照はネットワーク内の`refs/virtual/NNN/`(ここで`NNN`は何らかのフォークに対応する数値ID)に存在します。この場合、代わりに次のように記述できます

[bitmapPseudoMerge "all"]
	pattern = "refs/virtual/([0-9]+)/(heads|tags)/"
	threshold = now
	stableThreshold = never
	sampleRate = 100
	maxMerges = 64

これにより、「1234-heads」や「5678-tags」のような擬似マージグループ識別子が生成されます(それぞれフォーク「1234」のブランチと、リモート「5678」のタグの場合)。

GIT

git[1]スイートの一部

scroll-to-top