Git 代码库膨胀漏洞:微软工程师揭示缺陷,修复方案即将推出
微软工程师 Jonathan Creamer 近日发现 Git 中一个会导致代码库膨胀的缺陷,并发布了修复方案。 这一发现引发了开发者社区的广泛关注,因为代码库膨胀不仅会占用过多的磁盘空间,还会导致 Git 运行缓慢,甚至完全失败。
问题根源:文件名哈希算法缺陷
Creamer 在使用一个大型 JavaScript Git存储库时,发现克隆该库竟然消耗了 178GB 的磁盘空间,远超预期。他咨询了 Git 贡献者 Derrick Stolee,后者发现问题在于 Git 在比较文件名时,会对路径名进行哈希运算,而当前的哈希算法只考虑了路径名的最后 16 个字符,这会导致文件名冲突,从而导致代码库膨胀。
Stolee 举例说明,在同一个代码库中,多个项目可能都包含名为 CHANGELOG.md
的文件,但这些文件实际上来自不同的软件包,Git 在比较这些文件时,会错误地认为它们是同一个文件,并记录下所有差异,导致代码库膨胀。
修复方案:引入 path walk API
为了解决这个问题,Stolee 向 Git 提交了一个 Pull 请求,添加了名为 “path walk API” 的新功能。该 API 可以按路径对 Git 对象进行分组,从而避免文件名冲突。
Creamer 使用新增的 -path-walk
参数,将 git repack
命令应用于大型存储库,结果库的大小减小到了 5GB,显著节省了磁盘空间。
影响范围:大型存储库受影响较大
虽然新选项可以显著节省空间,但这些例子都是大型存储库,有很多潜在的文件名冲突。典型的 Git 存储库无法以同样的方式受益。
开发者呼吁:尽快修复漏洞
尽管如此,开发者们还是希望在 Git 的发行版本中尽快看到这些新功能,以解决代码库膨胀的问题。
专家建议:关注代码库大小
专家建议开发者们关注代码库的大小,并定期使用 git repack
命令进行压缩。如果发现代码库膨胀过快,可以考虑使用 -path-walk
参数进行优化。
总结:
Git 代码库膨胀是一个普遍存在的问题,微软工程师的发现和修复方案为解决这一问题提供了新的思路。开发者们应关注代码库大小,并及时采取措施,避免代码库膨胀带来的负面影响。
参考文献:
Views: 0