Git 2.37 已正式发布。
主要变化
- 新增用于修剪不可达对象 (unreachable object) 的机制
- 新增适用于 Windows 和 macOS 的内置文件系统监视器
- 稀疏索引 (sparse index) 已可以广泛使用
修剪不可达对象
在 Git 中,对象可被分类为“可达”和“不可达”。当至少有一个引用(分支或标签)时,一个对象是“可达的”,你可以从该引用开始一个对象遍历(从提交遍历到其父级,从树遍历到其子树,等等),然后在目的地结束。类似地,当不存在这样的引用时,一个对象是“不可达”的。
Git 2.37 引入了一个新概念 cruft packs,它允许将“不可达”对象一起存储在单个包文件中,方法是将各个对象的 age 写入存储在包旁边的*.mtimes
文件的辅助表中。
在实践中,它们可以允许仓库以更长的宽限期来进行修剪,而不必担心创建许多松散对象的可能性。通过运行下方命令进行尝试:
$ git gc --cruft --prune=1.day.ago
内置文件系统监视器
工作目录大小是显著影响 Git 性能的其中一个因素,
例如,当你运行git status
.git 时,Git 必须爬取你的整个工作目录(在最坏的情况下)才能确定哪些文件已被修改。
Git 对文件系统有自己的 cached understanding,以避免在许多情况下进行整个目录遍历。但是对于 Git 来说,在工作时使用磁盘的实际状态更新对文件系统的 cached understanding 可能会很昂贵。
过去,Git 可以通过 hook与 Watchman 等工具集成,从而可以用更直接地跟踪文件系统状态的长时间运行的守护进程来替换 Git 昂贵的刷新过程。
但是设置这个钩子并安装第三方工具可能很麻烦。在 Git 2.37 中,此功能内置于 Windows 和 macOS 上的 Git 本身,无需安装外部工具和配置钩子。
通过启用core.fsmonitor
配置设置即可为仓库启用此功能。
$ git config core.fsmonitor true
完成配置后,初始git status
命令将花费正常的时间。
详情查看发布公告。