编程 Git 2.52 的实用改动:git last-modified、geometric 维护,以及 3.0 前的 main 与 Rust

2026-10-02 21:01:28

Git 2.52 的实用改动:git last-modified、geometric 维护,以及 3.0 前的 main 与 Rust

Git 2.52.0 于 2025-11-17 发布,包含 637 个非合并提交,94 位贡献者,其中 33 位是新人。

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 之前保持可选,届时将成为必需。
复制全文 生成海报 Git 版本控制 性能优化 运维 工具链

推荐文章

程序员茄子在线接单