lint-staged 不自动触发是因 Git pre-commit 钩子未正确安装;需确认 husky 是否初始化、.git/hooks/pre-commit 是否存在且可执行,并确保文件匹配路径以项目根为基准、glob 使用正斜杠、避免 VSCode 与 lint-staged 重复格式化。

lint-staged 在 VSCode 里不自动触发?检查 pre-commit 钩子是否真在运行
VSCode 本身不执行 lint-staged,它只负责调用 Git 命令;真正触发检查的是 Git 的 pre-commit 钩子。如果你点 VSCode 右下角“提交”按钮没反应,或终端里 git commit 也没跑检查,大概率是钩子根本没装上。
- 运行
npx lint-staged --version确认已安装(通常随husky或simple-git-hooks引入) - 检查
.git/hooks/pre-commit文件是否存在且可执行(不是空文件、不是 Windows 的.cmd后缀残留) - 如果用
husky@8+,确保已执行过npx husky install,且package.json里有"prepare": "husky install"并运行过npm run prepare - VSCode 默认走系统 shell 提交,但某些终端配置(如 zsh 插件覆盖 PATH)可能导致找不到
npx,可在 VSCode 设置里加"git.terminalAuthentication": false强制走 GUI 提交流程(需配合 husky 正常工作)
配置 lint-staged 规则时文件匹配不到?注意 glob 模式作用域和路径基准
lint-staged 匹配的是 Git 暂存区中的相对路径(以项目根为基准),不是你当前编辑器打开的文件路径,也不是 src/ 子目录下的相对路径。常见现象:改了 src/utils/index.ts,但 "src/**/*.{ts,tsx}" 没生效。
- 所有 glob 必须写成相对于项目根的路径,例如
"**/*.{js,jsx,ts,tsx}",而不是"src/**/*"(除非你明确只想处理 src 下的暂存文件) - Windows 用户要注意反斜杠问题:
"src\**\*.ts"是错的,统一用正斜杠"src/**/*.ts" - 若使用
eslint+prettier组合,别把prettier --write放在eslint --fix前面——eslint可能会覆盖prettier格式化结果,建议顺序为eslint --fix→prettier --write - 示例正确配置片段:
"lint-staged": { "**/*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"], "**/*.{json,md,yml}": ["prettier --write"] }
VSCode 保存时就格式化,但提交又跑一遍?避免重复操作和冲突
VSCode 的 editor.formatOnSave 和 lint-staged 都调 prettier,容易造成两次格式化、甚至因 ESLint 自动修复插入分号而与 Prettier 冲突。
- 推荐关闭 VSCode 的自动保存格式化(设
"editor.formatOnSave": false),把格式化权完全交给lint-staged—— 它只处理你真正要提交的文件,更精准 - 如果坚持保留保存时格式化,请确保 VSCode 使用的 formatter(如
esbenp.prettier-vscode)配置与lint-staged中一致,尤其是prettier.printWidth、semi、singleQuote等关键项 - 检查
.prettierrc和.eslintrc.cjs是否存在规则冲突,比如eslint-config-prettier没关掉semi规则,而prettier设了semi: false,就会在提交时反复增删分号
修改后 git add . 但 lint-staged 没跑?确认暂存文件类型和 hook 执行时机
lint-staged 只对「已加入暂存区」的文件运行,且只在 git commit 这一刻触发。常见误操作:改完代码直接点 VSCode 提交按钮,但忘了先 git add。
- VSCode 提交面板默认只提交已暂存文件(Staged Changes),如果右侧面板里没看到文件,说明还没
git add,此时点击提交不会触发lint-staged - 检查
lint-staged配置中是否漏写了目标后缀,比如改了.vue文件,但配置里只有"*.js",自然跳过 - 某些 IDE 插件(如 GitLens)可能绕过标准 Git CLI,导致钩子失效;遇到异常可尝试在终端手动运行
git add . && git commit -m "test"验证基础流程 - Mac 上如果用
zsh,偶尔会因 shell 函数覆盖npx导致钩子报command not found: npx,可在.husky/pre-commit开头加#!/usr/bin/env bash并显式指定/opt/homebrew/bin/npx(或你的实际路径)
最常被忽略的一点:lint-staged 不处理未被 Git 跟踪的新文件(untracked files),哪怕你 git add -N 告诉 Git “我知道这文件”,它也不会进 lint 流程——必须先 git add 再 git commit,且文件已在 .gitignore 之外。











