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(输出请求细节,分享前先脱敏)。