You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:33:13