我正在设计一个基于UUID的目录结构,所以我正在研究git的作用,看看它是不是一个好模型。
我可以看到git将对象存储在一个结构中,其中哈希的前两个字符用作目录,其余的哈希是文件名。
我想知道为什么?如果使用目录有一个很大的好处,为什么不创建更多的子目录...说一个目录为哈希创建一个树的每一个或两个字符?如果没有很大的优势那么为什么带有前两个字符的目录?
答案 0 :(得分:20)
当松散对象的数量超过魔术常量时,Git从“松散对象”(在名为01/23456789abcdef0123456789abcdef01234567
的文件中)切换到“包”(默认情况下为6700但可配置,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)。]