Git 2.52 的实用改动:git last-modified、geometric 维护,以及 3.0 前的 main 与 Rust
Git 2.52.0 于 2025-11-17 发布,包含 637 个非合并提交,94 位贡献者,其中 33 位是新人。
- 发布说明:Git v2.52 Release Notes
- GitHub Blog:Highlights from Git 2.52
- GitLab:What's new in Git 2.52.0
git last-modified:按整棵 tree 算最近触及提交
新命令 git last-modified 显示触及每个路径的最近祖先提交,相当于 tree 级别的 blame。
和逐个文件跑 git log --max-count=1 相比,它按整棵 tree 计算,速度约为前者的两倍以上。GitLab 的 Gitaly 已经改用这个命令(目前仍在 feature flag 之后)。这是 2.52 里最实用的性能和工作流改进之一。
git maintenance 新增 geometric 策略
git maintenance 增加了 geometric 策略,作为旧的基于 git gc 策略的完整替代。
它的做法是检查 packfile,判断何时可以做几何 repack,尽量不每次都全量重打,只在必要时回退到传统 git gc,并且以更低的频次 prune 不可达对象。适合大型 monorepo,能减少 churn,让对象保持在更优的状态。
仓库自省:git repo、git refs、git diff-tree
- 实验性的
git repo命令,把历史上散落在rev-parse里的功能收拢过来。git repo info报告仓库是否为 bare/shallow、对象与引用格式,并新增-z(等价于--format=nul);git repo structure输出对象数、引用数等结构摘要。 git refs新增list与exists两个子命令:list等价于git for-each-ref,支持相同选项;exists等价于git show-ref --exists。方便脚本以底层且一致的方式访问引用。git diff-tree新增--max-depth。
其他改动
sparse-checkout新增clean动作,清理位于稀疏检出定义之外、否则不会被使用的工区文件,修复了修改定义后遗留文件难以清理的老问题。- 配置变量
commitGraph.changedPaths可以为git commit-graph默认打开--changed-paths。 - Bloom filter 支持更多 pathspec:当 pathspec 中部分组件含通配符(例如
foo/bar/*/baz)时,非通配组件也能用 Bloom filter 加速路径作用域遍历。 git describe改用优先队列,提速约 30%;git remote rename更新引用更高效;git log -L处理合并提交时避免不必要的树级 diff。fast-import新增--signed-commits=与--signed-tags=,对导入时的签名数据提供更多控制。git send-email可以用git imap-send把已发邮件存入 IMAP 文件夹。core.commentChar=auto因实现麻烦、收益低被标记为弃用。
面向 Git 3.0 的准备
git init在没有被其它配置覆盖时,将默认使用main而不是master,从 Git 3.0 起生效。可以用WITH_BREAKING_CHANGES构建标志提前测试。- symlink symref 被加入「Git 3.0 边界会消失」的清单。
- Rust 首次出现:可选构建标志
WITH_RUST,启用后用 Rust 实现对变宽整数(varint)的编解码。当前范围有限,是为后续组件迁移铺路。Rust 支持在 Git 3.0 之前保持可选,届时将成为必需。