为什么git将对象存储在散列的前两个字符的目录中?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (13)

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

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

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

提问于
用户回答回答于

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(N2),而272仅为729,而4192是175561)。

扫码关注云+社区