PAYATHON 2026

如何让 Lefthook 和 ESLint 检查 Git 暂存内容?

数据小陈

结论

{staged_files} 会让 Lefthook 把暂存文件的路径传给 ESLint,但 ESLint 读取的是这些路径在工作区中的文件内容,不会自动读取 Git index 中的文件快照。因此,如果暂存后又在工作区修复了 5 个错误,却没有再次暂存,ESLint 检查到的就是修复后的内容,可能只报告剩下的 3 个错误。Lefthook 文档也将 {staged_files} 定义为待提交的暂存文件,并以将这些文件路径传给 linter 为例。Lefthook run 文档

用 lint-staged 隔离未暂存修改

可以让 Lefthook 启动 lint-staged。它会选择暂存文件,并在运行任务前隐藏同一文件中的未暂存修改。这样,ESLint 读取的内容就对应暂存版本,任务结束后未暂存修改会恢复。lint-staged 文档

安装开发依赖:

npm install --save-dev lint-staged

将 Lefthook 的命令改为:

pre-commit:
  commands:
    lint-staged:
      run: npx lint-staged

在项目根目录添加 .lintstagedrc.json:

{
  "*.{js,ts}": "eslint"
}

运行 git commit 时,lint-staged 会对匹配的暂存文件执行 ESLint。检查失败时,提交会被阻止;任务结束后,未暂存修改会恢复。lint-staged 默认会创建备份 stash,也会处理部分暂存文件中的未暂存改动,具体行为见其文档。

注意事项

调整 Lefthook 的 glob 或 {staged_files} 只能筛选文件路径,无法让 ESLint 直接读取 Git index 中的文件内容。如果不使用 lint-staged,就需要另行实现检出暂存内容,或临时隐藏未暂存修改。单纯把文件名传给 npx eslint 并不能实现这一点。

备注:内容仅供参考。