我已经在.git目录中看到以下路径。
.git/object/3b/12abef878787483abeceddaa5544489abff789a
当实际SHA为3b12abef878787483abeceddaa5544489abff789a时
这是文件内容的SHA,因此应在不包含/的情况下进行存储。为什么git将blob存储在这个奇怪的路径中,这样做的好处是什么?
原因是要防止一个目录中的文件过多。与开头的所有SHA值3b
存储在一个子目录3b
,在任何单个目录的工作量是1/256日的会是什么,如果所有的斑都在一个目录中。最终,这可以提高性能。查找特定斑点的搜索工作量减少。
您可以在terminfo
目录中看到类似的效果,在目录中,根据终端条目的首字母将条目细分为目录。CPAN系统具有authors/id/A/AA/AARDVARK
其命名层次结构。
请为我详细说明。
假设git
要查找Blob 3b12abef878787483abeceddaa5544489abff789a
,并且目录分区方案未使用。为了争辩,可能有512个Blob,并且要获取该文件,内核可能必须读取其中的所有512个目录条目.git/objects
才能找到正确的条目。
现在假设正在使用目录分区方案,并且由于统计上的错误,奇迹般地出现了256个子目录,每个子目录包含2个文件。现在,内核在最坏的情况下必须在目录中读取每个条目具有2个字节名称的256个目录条目(相比之下,在./git/objects
目录中则是从512个具有32个字节名称的目录条目读取),然后在最坏的情况下,内核必须读取2个具有30字节名称的条目该./git/objects/3b
目录。
存在复杂的因素,例如不完全平衡的哈希和内存缓存以及磁盘访问,但是通常的想法是将文件分布到多个子目录中意味着OS内核要做的工作较少。如果目录中的文件数将扩展到数百个,则值得考虑对其进行分解。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句