根本原因是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 脚本能“看见”它。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 在项目根目录下运行
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。

















