36

我正在设计一个基于 UUID 的目录结构,所以我正在研究 git 的作用,看看它是否是一个好的模型。

我可以看到 git 将对象存储在一个结构中,其中散列的前两个字符用作目录,散列的其余部分是文件名。

我想知道为什么?如果使用目录有很大的优势,为什么不创建更多的子目录……比如说为哈希中的每一个或两个字符创建一个目录,从而创建一棵树?如果没有很大的优势,那么为什么要使用前两个字符的目录?

4

1 回答 1

28

01/23456789abcdef0123456789abcdef01234567当松散对象的数量超过一个魔术常数(默认为 6700,但可配置, )时, Git 从“松散对象”(在名为 like 的文件中)切换到“包” gc.auto。由于 SHA-1 值往往分布良好,因此可以通过查看单个目录来近似总松散对象。如果其中一个对象目录中有超过 (6700 + 255) / 256 = 27 个文件,则该打包文件了。

因此,不需要额外的扇出 ( 01/23/4567...):您不太可能在一个目录中获得这么多对象。事实上,更大的扇出往往会更难检测到是时候进行自动打包,除非您将阈值设置得更高(高于 6700),因为 (27 + 255) / 256 为 1,所以您会想把所有东西都计算在内,01/*/而不是仅仅计算在内01/

可以使用0/1234567...并允许每个目录最多 419 个对象来获得相同的行为,但是线性目录扫描(在仍然使用这些对象的任何系统上)是 O(n 2 ),并且 27 2仅仅是 729,而 419 2是175561. [编辑:仅适用于文件创建,您有两个阶段搜索,一次是发现可以创建,第二次是查找插槽或追加。查找仍然是 O(n)。]

于 2013-09-11T03:39:32.233 回答