36

私は UUID に基づいてディレクトリ構造を設計しているので、git の動作を調べて、それが適切なモデルになるかどうかを確認しています。

git は、ハッシュの最初の 2 文字がディレクトリとして使用され、残りのハッシュがファイル名である構造にオブジェクトを格納していることがわかります。

私が疑問に思っているのは、なぜですか?ディレクトリを使用することに大きな利点がある場合、なぜそれ以上サブディレクトリが作成されないのですか... ハッシュ内の 1 つまたは 2 つの文字ごとにディレクトリが作成され、ツリーが作成されますか? 大きな利点がない場合、なぜ最初の 2 文字のディレクトリなのですか?

4

1 に答える 1

28

01/23456789abcdef0123456789abcdef01234567Gitは、ルース オブジェクトの数が魔法の定数 (デフォルトでは 6700 ですが、構成可能です) を超えると、 「ルース オブジェクト」( のような名前のファイル内) から「パック」に切り替わりますgc.auto。SHA-1 値は適切に分散される傾向があるため、単一のディレクトリを調べることで、ルーズ オブジェクトの合計を概算できます。オブジェクト ディレクトリの 1 つに (6700 + 255) / 256 = 27 個を超えるファイルがある場合は、パック ファイルの時間です。

したがって、追加のファンアウト ( 01/23/4567...) は必要ありません。1 つのディレクトリにそれほど多くのオブジェクトを取得することはまずありません。実際、(27 + 255) / 256 は 1 であるため、(6700 よりも) 高いしきい値を設定しない限り、ファンアウトが大きくなると、自動パッキングの時期を検出するのが難しくなる傾向があります。01/*/だけではなく、すべてをカウントしたいでしょう01/

0/1234567...ディレクトリごとに最大 419 個のオブジェクトを使用して許可することで、同じ動作を得ることができますが、リニア ディレクトリ スキャン (まだそれらを使用しているシステム上) は O(n 2 ) であり、27 2は単なる 729 ですが、419 2は175561. [編集: これはファイルの作成にのみ適用されます。2 段階の検索が行われます。1 回目は作成しても問題ないことを確認し、2 回目はスロットまたは追加を検索します。ルックアップはまだ O(n) です。]

于 2013-09-11T03:39:32.233 に答える