根本原因是git层面执行环境缺失:.husky/pre-commit脚本找不到npx或本地命令,缺可执行权限、未加载shell配置、shebang错误或git.enablesmartcommit=true绕过钩子。

VSCode 里 git commit 不触发 Husky,根本原因是什么
不是 VSCode 的锅,而是 Git 层面的执行环境断了。VSCode 只调用系统 git 命令,不负责注入 NODE_ENV、PATH 或 Node 版本管理器(如 pyenv、nvm)的路径。所以你在终端里能跑通的 git commit,在 VSCode 提交面板点 ✔️ 却静默跳过,大概率是:.husky/pre-commit 脚本找不到 npx 或本地 node_modules/.bin 下的命令。
-
.husky/pre-commit缺少可执行权限:Linux/macOS 下必须运行chmod +x .husky/pre-commit - VSCode 内置终端默认不加载 shell 配置文件(如
~/.zshrc),导致nvm use或pyenv shell没生效 -
.husky/pre-commit开头没写#!/usr/bin/env bash,在 macOS/Linux 上可能被当作普通文本忽略 -
git.enableSmartCommit设为true(默认值),会把未暂存文件直接塞进提交,绕过pre-commit对 staged 文件的检查逻辑
如何让 VSCode 正确识别项目里的 Node 环境
别指望 VSCode 自动继承你终端里的 Node 版本。它启动时用的是系统 PATH 或硬编码路径,和你的 shell 环境无关。最稳的方式是显式指定 Node 路径,并确保 husky 脚本能“看见”它。
监控一个或多个 GitCode 仓库的 PR,通过 OpenClaw Gateway 自动执行 AI 审查,发布 PR 评论,并发送钉钉和企业微信通知。
- 在项目根目录下运行
which node,拿到当前 shell 使用的 Node 路径(比如/Users/you/.nvm/versions/node/v20.15.0/bin/node) - 把该路径写进
.husky/pre-commit第一行:#!/Users/you/.nvm/versions/node/v20.15.0/bin/node(注意不是#!/usr/bin/env node) - 或者更通用的做法:在
.husky/pre-commit开头加一行export PATH="$HOME/.nvm/versions/node/$(nvm current)/bin:$PATH"(前提是机器上装了 nvm) - 验证是否生效:在
.husky/pre-commit里加echo "NODE: $(which node)" && echo "PATH: $PATH",然后在 VSCode 提交时看输出
pre-commit 该写 npx lint-staged 还是 npx prettier --write
写 npx lint-staged。这不是“推荐”,而是解决三个硬伤的刚需:
-
lint-staged自动从git diff --cached提取暂存文件,不会误扫node_modules或未git add的草稿 - 支持按后缀分发任务:比如
*.{js,ts}跑eslint --fix+prettier --write,而*.md只跑prettier --write - 格式化后自动执行
git add—— 这步不能省,否则eslint --fix改的是工作区,不重新暂存,husky 会因文件未更新而报错退出 - 如果直接写
npx prettier --write .,会遇到路径不存在、权限拒绝、或把.gitignore里排除的文件也重写
为什么 package.json 里的 lint-staged 配置不生效
配置本身没问题,但生效依赖两个隐性前提:glob 匹配和配置文件位置。
-
"*.{js,ts,jsx,tsx}"这种模式只匹配已git add的文件,如果提交的是index.tsx但没git add,它就不会进lint-staged -
.prettierrc、.eslintrc.js必须放在项目根目录且已git add—— VSCode 插件和npx lint-staged都靠这个路径读取,不存在“插件读一个、npx 读另一个” -
lint-staged默认只处理 UTF-8 编码文件,如果文件含 BOM 或 GBK 编码,会跳过且无提示 -
npx在 VSCode 终端里可能找不到本地node_modules/.bin,建议在.husky/pre-commit开头加cd "$(git rev-parse --show-toplevel)"切到项目根再执行
.husky/pre-commit 的真实 stderr。










