Git不再等待外部编辑器关闭问题排查与解决求助
问题原因分析及解决思路
核心问题根源
从你的GIT_TRACE日志和跨设备复现的情况看,Windows近期更新改变了Git调用外部GUI程序的等待逻辑——Git通过sh.exe启动Notepad时,Windows现在把Notepad识别为后台启动的独立进程,sh.exe会直接退出,导致Git误以为编辑器已关闭。VS Code能正常工作是因为它的--wait参数会让主进程保持阻塞直到窗口关闭,而你之前的Notepad++和WinMerge配置里没有对应的阻塞参数。
针对性修复方案
1. 修复Notepad++作为Git编辑器的配置
修改core.editor配置,让Notepad++启动后保持进程阻塞,直到窗口关闭:
[core] editor = cmd /c "start /wait notepad++.exe -multiInst -nosession -notabbar -noPlugin "$*""
解释:start /wait会强制cmd等待Notepad++进程完全退出后才结束,这样Git就能正确感知编辑器关闭事件。
2. 修复WinMerge作为difftool的配置
修改difftool.winmerge.cmd,添加WinMerge支持的-wait参数:
[difftool "winmerge"] cmd = WinMergeU.exe -e -u -wait "$LOCAL" "$REMOTE" keepBackup = false
-wait参数会让WinMerge保持进程活跃直到对比窗口关闭,避免Git提前删除临时文件。
调试验证方法
- 直接测试进程阻塞:在命令行执行
notepad++.exe yourfile.txt,查看cmd是否会立即回到提示符;如果是,说明Notepad++是后台启动,需要用start /wait包裹。 - 增强Git日志输出:除了
GIT_TRACE=1,还可以使用GIT_TRACE_COMMAND=1查看更详细的进程退出状态,确认是否是sh.exe提前退出导致的问题。 - 验证配置生效:修改配置后执行
git commit,编辑提交信息并关闭Notepad++,检查Git是否正常读取提交内容。
额外注意事项
- 若使用Scoop安装的Notepad++,建议配置绝对路径避免系统识别问题:
editor = cmd /c "start /wait C:/Users/username/scoop/apps/notepadplusplus/current/notepad++.exe -multiInst -nosession -notabbar -noPlugin "$*"" - 可尝试以管理员身份运行Git Bash,排除Windows更新后权限变化导致的进程启动异常。
内容的提问来源于stack exchange,提问作者Jatin Sanghvi
相关产品推荐
相关产品推荐

