git mergetool 通过 mergetool..path 配置工具绝对路径,如 git config --global mergetool.kdiff3.path "/path/to/kdiff3";merge.tool 仅指定工具名,不负责定位,二者必须配合使用,缺一将导致“tool not found”错误。

git config 里怎么配 mergetool 的绝对路径
git mergetool 默认只查 PATH,如果工具不在系统环境变量里(比如你装了 portable 版本的 kdiff3 或自己编译的 vimdiff),它会直接报错“tool not found”。这时候必须显式告诉 Git 工具在哪。
配置方式是用 mergetool.<tool>.path</tool>,不是 merge.tool 或其他变体。例如:
要指定 kdiff3 的完整路径:
git config --global mergetool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
Windows 上用反斜杠或正斜杠都行,但必须是可执行文件本身(不是目录):
git config --global mergetool.meld.path "C:/Program Files (x86)/Meld/meld.exe"
常见错误点:
- 写成目录路径(如
C:/Program Files/Meld/)→ 启动失败,报command not found - 路径含空格但没加引号 → shell 解析出错,Git 可能只读到前半段
- 用了
mergetool.path(缺具体工具名)→ 配置无效,Git 完全忽略 - 工具名大小写不一致(如
git config --global mergetool.Meld.path ...)→ 不生效,因为meld是小写注册名
为什么不能只设 merge.tool 就完事
merge.tool 只告诉 Git “用哪个工具”,不负责找它。Git 内部逻辑是:先查 mergetool.<tool>.path</tool>,找不到就 fallback 到 PATH 搜索。如果两者都没配,Git 会按内置顺序尝试 vimdiff、meld 等,但一旦失败就退出,不会提示“请配 path”。
所以这两个配置是解耦的:
-
merge.tool决定默认用谁(比如kdiff3) -
mergetool.kdiff3.path决定它在哪(比如/opt/kdiff3/bin/kdiff3)
漏掉后者,git mergetool 就会卡在“tool not found”,哪怕你确认该程序双击能运行。
验证路径是否生效的最快方法
不要等真冲突才试。运行这行命令即可触发路径检查:git mergetool --tool=kdiff3 --no-prompt --no-commit --no-symlinks --no-keep-backup --no-keep-temporaries /dev/null 2>&1 | head -n 5
如果路径正确,输出里会出现类似 Running merge tool kdiff3;如果路径错,会立刻报 error: cannot run kdiff3: No such file or directory。
注意:/dev/null 是占位符,Git 会跳过实际文件处理,只校验工具可执行性。这个技巧比改代码、造冲突再测试快得多。
Windows 下特别容易踩的坑
PowerShell 和 CMD 对路径解析不同,而 Git for Windows 默认用 MSYS2 shell。最稳妥的做法是:- 路径统一用正斜杠(
C:/Tools/vimdiff.exe),避免反斜杠转义问题 - 如果路径含空格,必须用双引号包裹整个值(
"C:/Program Files/vim/vim90/vimdiff.exe") - 别用快捷方式(.lnk 文件)→ Git 只认真实可执行文件
- 32/64 位工具混用时,确保和 Git 进程位数一致(Git for Windows 默认是 64 位)
配完记得 git config --global --list | grep mergetool 确认值已写入,有时候编辑器保存编码不对(如 UTF-8 with BOM)会导致 Git 读配置失败。











