Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑

每次 Code Review 都在争论空格和分号?CI 频繁因为格式问题失败?本文将用 10 分钟配置 Git Hook,实现提交前自动格式化、Lint、甚至跑单元测试。全程配置代码可直接复制。

一、痛点:CR 不应该讨论格式

在团队协作中,Code Review 的价值在于讨论架构、逻辑和潜在 bug,而不是"这里少个空格"、"ESLint 报错"。但现实中,这些琐事往往耗费大量时间。

解决方案 :利用 Git Hook(钩子)在 pre-commit 阶段自动执行:

  • 格式化代码(Prettier)
  • 检查语法(ESLint)
  • 可选:运行相关单元测试

工具链

  • Husky:简化 Git Hook 配置
  • lint-staged:只对暂存区文件执行检查(速度极快)

二、10 分钟配置步骤

2.1 安装依赖

bash 复制代码
npm install -D husky lint-staged

2.2 初始化 Husky

bash 复制代码
npx husky init

这会在项目根目录创建 .husky 文件夹,并在 package.json 中添加 prepare 脚本。

2.3 配置 lint-staged

package.json 中添加:

json 复制代码
{
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ],
    "*.{css,scss,json,md}": [
      "prettier --write"
    ]
  }
}

2.4 添加 pre-commit 钩子

编辑 .husky/pre-commit 文件:

bash 复制代码
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx lint-staged

2.5 测试

bash 复制代码
git add .
git commit -m "test hook"

如果暂存区有不符合 ESLint 的文件,会自动修复后提交;如果无法修复(如语法错误),提交会被阻止。

三、进阶配置

3.1 提交前自动跑单元测试(只测试相关文件)

安装 jest --findRelatedTests

json 复制代码
{
  "lint-staged": {
    "*.{js,ts}": [
      "eslint --fix",
      "prettier --write",
      "jest --bail --findRelatedTests"
    ]
  }
}

3.2 使用 commitlint 规范 commit message

bash 复制代码
npm install -D @commitlint/{cli,config-conventional}
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit "$1"'

3.3 跳过钩子(紧急情况)

bash 复制代码
git commit -m "fix" --no-verify

四、常见问题

问题 原因 解决
husky 命令找不到 未运行 npm install 或未执行 husky init 重装依赖,重新 npx husky init
lint-staged 不生效 pre-commit 文件缺少执行权限 chmod +x .husky/pre-commit
Windows 上钩子不运行 .husky 中的 shebang 路径问题 改用 cross-env 或 WSL
修复后仍然提交失败 ESLint 有无法自动修复的错误 手动修复后重新 git add

五、完整配置示例(可直接复制)

package.json 片段

json 复制代码
{
  "scripts": {
    "prepare": "husky"
  },
  "lint-staged": {
    "*.{js,ts,jsx,tsx}": ["eslint --fix", "prettier --write"],
    "*.{css,scss,json,md}": ["prettier --write"]
  }
}

.husky/pre-commit 文件

bash 复制代码
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx lint-staged

.husky/commit-msg 文件(可选)

bash 复制代码
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx --no -- commitlint --edit "$1"

六、总结

  • Husky + lint-staged 让代码规范自动化,CR 回归逻辑讨论
  • 配置成本仅 10 分钟,收益却是长期的
  • 支持渐进增强:先加格式化,再加 Lint,最后加测试
  • 文中所有代码已验证,可放心使用

建议收藏本文,下次新项目初始化时直接复制配置。

讨论:你们的团队用 Git Hook 了吗?有没有遇到过钩子导致提交缓慢的问题?欢迎评论区分享经验。

相关推荐
负责的蛋挞4 分钟前
异步HttpModule的实现方式
java·服务器·前端
黄敬峰41 分钟前
🚀 从 Prompt 到 Harness:AI 编程的下半场,我们如何给大模型套上“挽具”?
面试
用户8524950718443 分钟前
手搓自然语义搜索:从传统匹配到向量化,理解 RAG 的第一步
面试
C语言小火车1 小时前
C++ 快速排序(Quick Sort)深度精讲:分治思想、Lomuto 分区法及三数取中优化,面试手撕必会
c语言·开发语言·c++·面试·排序算法·快速排序
丹宇码农3 小时前
把 HLS 字幕玩出花:zwPlayer 如何让 M3U8 视频支持全文搜索、翻译与码率自适应
前端·javascript·音视频·hls·视频播放器
2501_943782353 小时前
【共创季稿事节】猜数字游戏:二分法思维与交互式反馈
前端·游戏·microsoft·harmonyos·鸿蒙·鸿蒙系统
GV191rLvq3 小时前
基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
服务器·前端·asp.net
吠品3 小时前
LangChain 里 tool_call_id 为空?一次 MCP 工具集成的排查记录
前端
微信开发api-视频号协议3 小时前
企业微信二次开发中的文件系统设计:媒体资源、临时文件与业务附件
前端·微信·企业微信·媒体·ipad·微信开放平台