这诊断 Git 速度慢的原因这篇文章中有这样一个有趣的内容:
启用文件系统缓存
Windows 的文件系统层与 Linux 的文件系统层本质上不同(Git 的文件系统访问针对 Linux 进行了优化)。作为一种解决方法,Windows 版 Git 提供了文件系统缓存,在初始“预热”后,在许多情况下可以加速操作。您可以为每个存储库激活文件系统缓存:
git config core.fscache true
如果我在 Git 中启用此选项,实际上会发生什么变化?Windows 7 中的文件系统缓存是什么样的,缓存了什么?“初始预热”需要什么?
答案1
以下是内容git config --help
:
核心.fscache
为某些操作启用文件系统数据的额外缓存。Windows 版 Git 使用此功能批量读取和缓存整个目录的 lstat 数据(而不是逐个文件执行 lstat)。
git 不会发出许多文件系统请求,而是只发出一个请求来获取有关目录中所有文件的信息。
更多技术描述可以在引入的提交中找到fscache
:
Win32:在 mingw 的 lstat 和 dirent 实现下添加缓存
由于 lstat 模拟速度较慢(git 对索引中的每个文件调用一次 lstat),因此在 Windows 上检查工作树状态非常慢。Windows 操作系统 API 似乎更擅长扫描整个目录的状态,而不是检查单个文件。
添加一个使用缓存来存储 lstat 数据的 lstat 实现。缓存未命中时,将读取整个父目录并将其添加到缓存中。对同一目录的后续 lstat 调用将直接从缓存中获取。
还实现 opendir / readdir / closedir,以便它们在缓存中创建和使用目录列表。
缓存不会跟踪文件系统变化,也不会插入任何修改文件 API,因此必须为不修改工作副本的 git 函数明确启用它。