セットアップと設定
プロジェクトの取得と作成
基本的なスナップショット
ブランチとマージ
プロジェクトの共有と更新
検査と比較
パッチ適用
デバッグ
メール
外部システム
サーバー管理
- 2.46.1 → 2.50.1 変更なし
-
2.46.0
2024-07-29
説明
このドキュメントは、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>.stableThreshold
とbitmapPseudoMerge.
<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>.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)に設定すると、より多くの安定したグループが生成されますが(これは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]スイートの一部