VSCode内置终端找不到node命令是因为其GUI启动未加载系统PATH,需通过勾选“Terminal > Integrated: Inherit Env”或配置settings.json修复;lint-staged静默失败需用--debug排查;Husky v8+的set -e导致钩子脆弱,应加兜底逻辑;错误信息藏在「输出」面板→Git标签页中。

VSCode内置终端找不到node命令
VSCode里点提交按钮失败,报错.git/hooks/pre-commit: line 39: node: command not found,大概率不是没装Node,而是VSCode启动时没加载系统PATH。它用的Shell环境和你手动开的终端可能不一样——比如macOS下VSCode常从GUI启动,不读~/.zshrc或~/.bash_profile。
验证方法:在VSCode内置终端运行which node,再对比系统终端(如iTerm)输出。如果前者为空或路径不对,就坐实了这个问题。
- 临时方案:在
.husky/pre-commit第一行加export PATH="/opt/homebrew/bin:$PATH"(macOS Homebrew路径)或export PATH="C:\Program Files\nodejs\:$PATH"(Windows) - 根治方案:在VSCode设置里搜
terminal integrated env,勾选Terminal > Integrated: Inherit Env;或手动把Node路径写进VSCode的settings.json:"terminal.integrated.env.osx": {"PATH": "/opt/homebrew/bin:/usr/local/bin:${env:PATH}"} - 注意nvm用户:不要只配
node路径,还要确保nvm use被触发,可在.husky/pre-commit开头加source ~/.nvm/nvm.sh && nvm use
lint-staged执行报错但没输出具体信息
VSCode提交弹窗只显示husky > pre-commit hook failed,没堆栈、没文件名,基本是因为lint-staged静默失败了——它默认不打印处理了哪些文件,出错时也只返回非零码,不抛详细错误。
直接在终端跑npx lint-staged --debug,能看到它实际调用了哪些命令、传了什么参数、哪一步卡住。常见原因包括:
-
package.json里lint-staged配置的glob模式(如"*.ts")没匹配到任何暂存文件,导致命令根本没执行——加个echo "running"到.husky/pre-commit里确认脚本是否进了这一步 - ESLint配置里用了VSCode插件才有的规则(如
@typescript-eslint/no-unused-vars),但lint-staged走的是本地node_modules/.bin/eslint,版本或插件缺失 - Prettier写入失败:文件被其他程序占用(如VSCode正在编辑该文件)、权限不足(尤其Windows上Git Bash对NTFS权限敏感)
Husky v8+的set -e让钩子异常脆弱
Husky v8起默认启用set -e,意味着.husky/pre-commit里任意一行命令退出码非0,整个钩子立刻中断。这看起来严谨,但实际容易误杀——比如git add因文件锁失败、prettier --write遇到只读文件、甚至npm ls查依赖时网络抖动超时。
排查时别只盯着最终报错命令,要看.husky/pre-commit全文执行流:
- 把
set -e临时删掉,再提交,观察哪一行先挂——常是npm run lint或lint-staged前的环境检查命令 - 对可能失败的命令加兜底:比如
git add . || true,或用|| echo "warning: git add skipped"代替静默失败 - 避免在钩子里调用需要交互的命令(如
npm install),Husky不提供stdin,会卡死
VSCode「输出」面板里看不到完整错误
VSCode提交失败后,错误只闪一下就没了。很多人只看右下角提示,错过关键线索。真正的错误全在「输出」面板里,但默认不自动跳转,且要手动切对标签页。
必须这么做:
- 按
Ctrl+Shift+U(Win/Linux)或Cmd+Shift+U(macOS)打开「输出」面板 - 右上角下拉菜单选
Git——不是Tasks,也不是Extensions;如果没反应,再试Husky或Log (Git)(取决于VSCode版本) - 错误通常出现在最后一屏,往上翻几页才能看到
eslint或prettier的真实报错,比如Cannot find module 'eslint-plugin-react'或Error: EACCES: permission denied, open '/src/App.tsx' - 如果还是空,说明钩子根本没执行——检查
.husky/pre-commit是否有可执行权限:ls -l .husky/pre-commit,缺x就补:chmod +x .husky/pre-commit
node -v和which node在VSCode终端里能跑通,再动钩子脚本。


















