使用husky与lint-staged时,如何修复ESLint错误但不自动提交已修复的变更?
如何阻止husky+lint-staged自动提交ESLint修复后的变更
我明白你的痛点——当ESLint通过--fix自动修复代码问题后,husky和lint-staged直接把这些修改塞进了提交流程,完全没给你留审阅修复内容的机会。下面给你两种实用的解决方案,帮你拿回提交的控制权:
方案1:修复后主动中断提交,提示你审阅变更
这个方案会在ESLint完成修复后自动检查是否有文件被修改,如果有就立刻中断提交流程,同时给出明确提示,让你先查看、确认修复内容,再手动完成提交。
修改你的package.json配置如下:
{ "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.{js,vue,html,json}": [ "./node_modules/.bin/eslint --fix", "bash -c 'if git diff --quiet; then exit 0; else echo \"⚠️ ESLint自动修复了部分代码问题,请先检查变更,确认后重新执行提交\"; exit 1; fi'" ] } }
为什么这么做:
eslint --fix:自动修复所有可修复的Linting问题- 后面的shell脚本会用
git diff --quiet检查工作区和暂存区是否有差异。如果ESLint确实修改了文件,脚本就会输出提示信息并返回错误状态,直接中断husky的提交流程。 - 这时你可以用
git diff查看具体的修改内容,确认没问题后执行git add .重新暂存修复后的文件,再正常提交即可。
方案2:禁用lint-staged自动暂存修复文件的行为
lint-staged默认会把修复后的文件自动添加到暂存区,我们可以通过--no-add参数直接禁用这个默认行为,让修复后的文件留在工作区,不会被自动纳入提交队列。
修改husky的hook配置如下:
{ "husky": { "hooks": { "pre-commit": "lint-staged --no-add" } }, "lint-staged": { "*.{js,vue,html,json}": [ "./node_modules/.bin/eslint --fix" ] } }
原理说明:
--no-add参数告诉lint-staged:修复完文件后,不要自动把它们加到暂存区。- 执行提交时,husky会因为暂存区和工作区存在差异而中断提交(你也可以结合方案1的提示脚本,让流程更友好)。
- 你需要手动检查工作区的修改,确认无误后执行
git add将修复后的文件加入暂存区,再完成提交。
小提醒:移除重复配置
注意到你当前的package.json里,同时在scripts和husky.hooks里定义了pre-commit,这会导致重复执行。建议删除scripts下的pre-commit配置,只保留husky hooks里的配置就好。
内容的提问来源于stack exchange,提问作者imleaving
相关产品推荐
相关产品推荐

