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

概要

"擬似マージビットマップ"は、次のようなビットマップのペアを指すために使用されます。

コミットビットマップ

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

マージビットマップ

擬似マージの「コミット」ビットマップ(前述)にあるコミットのセットに対する到達可能性の閉包を記述するビットがセットされたビットマップ。コミットビットマップで記述されたのと同じ親のセットで、オクトパス・マージと同じビットマップが生成されます。

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

ユースケース

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

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

設定

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

グループ内では、コミットは年齢に応じて「安定」または「不安定」とみなされます。これらは、それぞれbitmapPseudoMerge.<name>.stableThresholdbitmapPseudoMerge.<name>.thresholdの設定値を設定することで調整されます。

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

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

グループのサイズは冪乗則減衰関数によって決定され、減衰パラメータは、f(n) = C*n^(-k/100) における「k」にほぼ対応します。ここで、f(n)n番目の擬似マージグループのサイズを表します。サンプルレートは、候補として考慮される適格なコミットの割合を制御します。閾値パラメータは最小年齢を示します(擬似マージグループに最近すぎるコミットが含まれるのを避けるため、有効である可能性を低くします)。「maxMerges」パラメータは、個々のグループの擬似マージコミット数の上限を設定します。

「stable」関連のパラメータは、「stable threshold」値よりも古く、年齢順に「stableSize」のチャンクにグループ化できる固定数のコミットで構成される「stable」擬似マージグループを制御します。

擬似マージの正確な設定は次のとおりです。

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

参照名を一致させるために使用される正規表現。このパターンに一致する参照によって指し示されるコミット(およびbitmapPseudoMerge.<name>.sampleRatebitmapPseudoMerge.<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)に設定すると、より多くの安定したグループが生成されますが(これは1回限りの生成コストを伴う)、それらのグループは時間が経つにつれて陳腐化する可能性が高くなります。より大きな値を使用すると、逆のペナルティが発生します(安定したグループが少なくなり、より有用になります)。

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