首页/开发/Git 与协作速查/Trace2 诊断 Git 命令性能
进阶与大仓实践69 条

Trace2 诊断 Git 命令性能

用 GIT_TRACE2_PERF 记录命令内部耗时,定位是网络、索引还是磁盘导致慢;诊断完记得关闭,避免日志影响正常使用。

Git 与协作速查开发更新于 2026-10-13

trace2 是什么

Git 的 trace2 机制通过环境变量输出命令内部事件:GIT_TRACE2_PERF 记录各阶段耗时(索引刷新、对象读取、网络等待等),GIT_TRACE2 输出简要流程,用来回答「这个命令为什么慢、卡在哪一层」。日志默认写 stderr,也可以指定文件收集;配合 GIT_TRACE 还能看到子进程调用链。诊断完记得关闭,避免日志拖慢日常操作。

基本信息

常用变量GIT_TRACE2=1(简要)、GIT_TRACE2_PERF=1(性能事件)
输出默认 stderr;值设为路径时写入文件
配套GIT_TRACE=1 追踪子进程调用
适用平台Linux / macOS / Windows 通用
典型对象status、fetch、checkout、gc 等慢命令
使用原则采集完即关闭,避免日志影响正常使用

典型使用场景

  • 慢命令定位:status 慢时看索引刷新与 stat 阶段各占多少
  • 网络分层:fetch 慢时区分网络等待与本地处理
  • 钩子排查:命令卡顿时看是否耗在钩子子进程上
  • 版本对比:升级 Git 前后对比同命令的阶段耗时
  • CI 诊断:流水线偶发变慢时采集一份用于分析
  • 问题上报:把 PERF 日志与复现步骤一起附在报告里,减少来回沟通

常用示例

常用示例
GIT_TRACE2_PERF=1 git status 2> trace.log     # 采集 status 的性能事件
grep -E 'refresh|read_index|stat' trace.log | head   # 查看关键阶段
GIT_TRACE=1 git fetch origin 2>&1 | head -30  # 追踪子进程调用链
GIT_TRACE2_PERF=/tmp/t2.log git checkout .    # 直接写入文件收集

变量对照

变量输出内容适用
GIT_TRACE2简要事件流看流程与调用顺序
GIT_TRACE2_PERF性能事件与阶段耗时定位慢在哪一段
GIT_TRACE子进程与命令调用排查钩子与别名链
值为路径写入文件长日志收集与分享
先复现慢命令再采集日志;带 GIT_TRACE2_PERF 的日志可交给分析工具统计各阶段耗时,快慢各采一次对比更直观。
临时开启即可:用完清除环境变量,别写进 shell 配置文件长期生效。
网络层细查可以叠加 GIT_TRACE_CURL(输出请求细节,分享前先脱敏)。

易错点

  • 长时间开启:追踪日志显著增大输出,可能拖慢交互操作
  • 分享不检查:日志含仓库路径与远端地址,外发前先检查内容
  • 只报慢不带日志:问题描述无法定位,采集与复现要一起做
  • 阶段归因误读:把网络等待当本地 IO,对比不同命令的日志再下结论
  • 环境残留:变量写进配置文件长期生效,日常操作一直被日志拖慢
  • 采集姿势不当:长日志直接刷屏难筛,写文件再用关键字过滤关键行

数据来源与参考

  • Git 官方文档:git(GIT_TRACE2 环境变量)
  • Git Trace2 API 文档(api-trace2)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌