Husky — Git Hooks 管理工具
现代、轻量、零依赖的 Git Hooks 管理工具,通过 core.hooksPath 原生机制将钩子脚本纳入版本控制,让团队在 git commit、git push 等操作时自动触发代码检查、测试与规范校验,是 JavaScript/TypeScript 前端工程化事实标准的 Git Hooks 解决方案。
Husky 是现代轻量零依赖的 Git Hooks 管理工具,通过 core.hooksPath 原生机制将钩子脚本纳入版本控制,自动触发代码检查与规范校验,是前端工程化 Git Hooks 的事实标准。
Husky — Git Hooks 管理工具
现代、轻量、零依赖的 Git Hooks 管理工具,通过
core.hooksPath原生机制将钩子脚本纳入版本控制,让团队在git commit、git push等操作时自动触发代码检查、测试与规范校验,是 JavaScript/TypeScript 前端工程化事实标准的 Git Hooks 解决方案。
技术简介说明
Husky 是由 typicode 创建并维护的开源 Git Hooks 管理工具,核心理念是 "Git hooks made easy"。它利用 Git 原生的 core.hooksPath 配置项,将 .husky/ 目录注册为钩子脚本路径,使所有钩子文件可以像源码一样被 Git 追踪、版本化和团队协作。
Husky 的核心价值在于:
- 零配置成本:一条
husky init命令完成全部初始化 - 零运行时依赖:包体仅 2 kB(gzipped),无任何第三方依赖
- 原生 Git 集成:通过
core.hooksPath机制,钩子脚本就是普通 Shell 文件 - 跨平台兼容:支持 macOS、Linux、Windows,兼容所有主流 Git 客户端
- 全钩子支持:覆盖 Git 全部 13 种客户端钩子(pre-commit、commit-msg、pre-push 等)
版本演进关键节点:
| 版本 | 时间 | 核心变化 |
|---|---|---|
| v4 | 2020 年 | 基于 package.json 的 hooks 字段配置,需 husky install |
| v5–v7 | 2021–2023 年 | 转向文件系统配置(.husky/ 目录),引入 husky install 命令 |
| v8 | 2023 年 | 过渡版本,开始废弃旧 API |
| v9 | 2024 年 | 重大简化:husky init 一键配置,prepare: "husky" 生命周期,废弃 shebang 和 husky.sh 引入,钩子脚本回归纯 Shell |
| v10(计划中) | 待定 | 将彻底移除 v9 中标记废弃的旧式钩子脚本格式 |
2025–2026 年,Husky v9.x 仍是 npm 生态中最广泛使用的 Git Hooks 工具,周下载量超过 2600 万次,GitHub 星标 35.2k,是 React、Next.js、Vite 等顶级开源项目的标配组件。
基本信息
| 项目 | 详情 |
|---|---|
| 官网 | https://typicode.github.io/husky/ |
| GitHub | https://github.com/typicode/husky |
| License | MIT |
| 最新稳定版 | v9.1.7(2024-11-18) |
| Node.js 要求 | >= 18(v9 起) |
| 包体大小 | 2 kB(gzipped),零依赖 |
| 运行耗时 | ~1ms(纯 Shell 执行,无 Node.js 开销) |
| npm 包名 | husky |
| npm 周下载量 | 约 2600 万+ |
| GitHub Stars | 35.2k |
| 代码语言 | 92.1% JavaScript,7.9% Shell |
| 历史发布 | 80+ 个版本,1001 次提交,134 位贡献者 |
快速上手
安装
# pnpm(推荐)
pnpm add -D husky
# npm
npm install --save-dev husky
# yarn(公开仓库需额外安装 pinst)
yarn add --dev husky
# yarn add --dev pinst # 仅公开仓库需要
# bun
bun add --dev husky初始化
# 初始化 Husky(生成 .husky/ 目录和默认 pre-commit 钩子)
npx husky init
# 或 pnpm exec husky init
# 或 bunx husky inithusky init 命令会:
- 在
.husky/目录下创建pre-commit钩子文件 - 在
package.json中添加"prepare": "husky"生命周期脚本
基础配置
执行 husky init 后,package.json 中会自动添加:
{
"scripts": {
"prepare": "husky"
}
}.husky/pre-commit 文件默认内容为:
npm test最小示例:完整集成
1. 安装并初始化:
pnpm add -D husky
npx husky init2. 配置 pre-commit 钩子(配合 lint-staged):
# .husky/pre-commit
npx lint-staged3. 配置 commit-msg 钩子(配合 commitlint):
# .husky/commit-msg
npx --no -- commitlint --edit "$1"4. 验证:
git commit -m "test: verify husky hooks"
# 应自动触发 lint-staged 和 commitlint 检查5. 临时跳过钩子:
# 单次跳过
git commit -m "quick fix" --no-verify
# 全局禁用(适用于 CI 或 GUI 客户端)
HUSKY=0 git commit -m "skip hooks"核心概念与架构
架构图
项目根目录/
├── .husky/ # 钩子脚本目录(被 Git 追踪)
│ ├── pre-commit # 提交前钩子
│ ├── commit-msg # 提交信息校验钩子
│ ├── pre-push # 推送前钩子
│ └── _/ # (v9 内部保留,用户无需关注)
├── package.json # "prepare": "husky" 生命周期
└── .git/
└── config # core.hooksPath = .husky(Husky 自动设置)
工作原理
开发者执行 git commit
↓
Git 读取 core.hooksPath(= .husky/)
↓
执行 .husky/pre-commit 脚本
↓
脚本内调用 lint-staged / tsc / eslint 等
↓
成功 → 提交继续
失败 → 提交中止,开发者修复后重试
生命周期与 prepare 脚本
Husky v9+ 使用 npm 的 prepare 生命周期钩子自动安装:
prepare在npm install(无参数)后自动触发- 本地开发时:自动设置
core.hooksPath指向.husky/ - CI/CD 环境:
npm ci不触发prepare,避免不必要的钩子安装 - 团队克隆后:首次
pnpm install即自动激活 Husky
{
"scripts": {
"prepare": "husky"
}
}注意:如果 CI 环境中
husky命令报错(例如未安装 devDependencies),可改为"prepare": "husky || true"静默处理。
钩子脚本格式(v9+)
v9 之后钩子脚本回归纯 Shell 格式,不再需要 shebang 和 husky.sh 引入:
# ✅ v9+ 正确格式(纯命令,无需 shebang)
npx lint-staged
npx tsc --noEmit# ❌ 旧格式(v9 中会警告,v10 将报错)
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged支持的 Git 钩子
Husky 支持 Git 全部 13 种客户端钩子:
| 钩子 | 触发时机 | 典型用途 |
|---|---|---|
pre-commit | git commit 前 | 代码格式化、lint-staged |
commit-msg | 提交信息编辑后 | commitlint 校验 |
pre-push | git push 前 | 运行测试、类型检查 |
pre-rebase | git rebase 前 | 防止在特定分支 rebase |
post-checkout | git checkout 后 | 分支切换后清理/安装 |
post-merge | git merge 后 | 自动安装新依赖 |
post-rewrite | git rebase/amend 后 | 重建索引 |
pre-auto-gc | 自动 GC 前 | 清理准备 |
applypatch-msg | git am 时 | 补丁信息校验 |
pre-applypatch | git am 应用前 | 补丁检查 |
post-applypatch | git am 应用后 | 触发通知 |
post-update | git pull 后 | 同步依赖 |
fsmonitor-watchman | 文件系统监控 | IDE 集成 |
核心特性
1. 零依赖、极致轻量
包体仅 2 kB(gzipped),无第三方运行时依赖。钩子执行耗时约 1ms,几乎无感知延迟。相比需要加载完整 Node.js 运行时的方案,性能优势明显。
2. 原生 core.hooksPath 集成
不修改 .git/hooks/ 中的文件,而是通过 Git 原生 core.hooksPath 配置指向 .husky/ 目录。钩子文件是标准 Shell 脚本,可被任何 Git 客户端识别。
3. 一键初始化(husky init)
单条命令完成全部配置:创建 .husky/ 目录、生成默认钩子、写入 package.json 的 prepare 脚本。无需手写任何配置。
4. 全钩子覆盖
支持 Git 全部 13 种客户端钩子,每种钩子对应 .husky/ 下的同名文件,命名直观。
5. 多行脚本支持
v9 起钩子文件支持多行命令,可在单个文件中编排多个检查步骤:
# .husky/pre-commit — 多步骤示例
npx lint-staged
npx tsc --noEmit
node scripts/check-file-size.js6. 跨平台与 Monorepo 兼容
支持 macOS、Linux、Windows,兼容自定义钩子目录和子目录项目。对于 Monorepo 中的子包,可通过相对路径调整 prepare 命令:
{
"scripts": {
"prepare": "cd ../.. && husky packages/my-app/.husky"
}
}7. 灵活的禁用机制
多种方式临时或永久禁用钩子:
# 环境变量临时禁用(单次)
HUSKY=0 git commit -m "skip"
# 初始化脚本中全局禁用(适配 GUI 客户端)
# ~/.config/husky/init.sh
export HUSKY=0
# CI 环境自动跳过
# npm ci 不触发 prepare,无需额外配置8. Node 版本管理器兼容
自动适配 nvm、fnm、volta 等 Node 版本管理器,支持在 ~/.config/husky/init.sh 中初始化版本管理器:
# ~/.config/husky/init.sh
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"9. 非 Shell 脚本桥接
钩子文件本身是 Shell 脚本,但可通过桥接调用任意语言:
# .husky/pre-commit — 调用 Node.js 脚本
node .husky/pre-commit.js# .husky/pre-commit — 使用 Bash heredoc
bash << EOF
set -e
echo "Running custom checks..."
./scripts/validate.sh
EOF10. 直观的错误报告
钩子脚本失败时,Git 直接展示 Shell 退出码和错误信息,无需额外调试工具,定位问题直观高效。
生态图
Husky 不直接提供 lint 或格式化能力,而是作为钩子执行层,与以下工具协同构成完整的代码质量链路:
核心生态
Git 操作
↓
Husky(钩子触发层)
↓
┌─────────────┬──────────────┬──────────────┐
│ lint-staged │ commitlint │ 其他工具 │
│ (文件过滤) │ (消息校验) │ (自定义检查) │
└──────┬──────┴──────┬───────┴──────┬───────┘
↓ ↓ ↓
ESLint/Biome Conventional tsc / Vitest
Prettier Commits 规范 Jest / Playwright
Stylelint cz-git 自定义脚本
常见组合
| 组合 | 用途 | 触发时机 |
|---|---|---|
| husky + lint-staged | 仅对暂存文件运行 ESLint/Prettier | pre-commit |
| husky + commitlint | 校验 commit message 格式 | commit-msg |
| husky + cz-git / commitizen | 交互式生成规范提交信息 | 手动 git cz |
| husky + tsc --noEmit | 推送前全量类型检查 | pre-push |
| husky + vitest / jest | 推送前运行单元测试 | pre-push |
| husky + pretty-quick | 快速格式化暂存文件 | pre-commit |
完整工程化示例
# .husky/pre-commit
npx lint-staged
# .husky/commit-msg
npx --no -- commitlint --edit "$1"
# .husky/pre-push
npx tsc --noEmit
npx vitest run// lint-staged.config.js
export default {
'*.{js,ts,tsx}': ['eslint --fix', 'prettier --write'],
'*.{css,scss}': ['stylelint --fix', 'prettier --write'],
'*.{json,md}': ['prettier --write'],
}适用场景
1. 团队代码规范强制执行
通过 pre-commit 钩子配合 lint-staged,在每次提交前自动运行 ESLint、Prettier、Stylelint,阻止不符合规范的代码进入版本库。相比 CI 事后检查,本地即时反馈效率提升 10 倍以上。
2. Commit Message 规范落地
结合 commitlint 在 commit-msg 钩子中校验提交信息格式,确保 Conventional Commits 规范被严格遵循,为自动化 CHANGELOG 生成、语义化版本发布提供可靠数据基础。
3. 推送前质量门禁
在 pre-push 钩子中运行 tsc --noEmit 和完整测试套件,防止类型错误或测试失败的代码被推送到远程仓库,降低 CI 失败率和代码审查负担。
4. 开源项目贡献者体验
开源项目贡献者来自不同背景,Husky 确保每位贡献者(无论 IDE 或命令行)在克隆后首次 npm install 即自动激活钩子,无需额外文档说明。React、Next.js、Vite 等项目均采用此方案。
5. Monorepo 多包协调
在 Turborepo / pnpm workspace 的 Monorepo 中,通过根目录 .husky/ 统一管理钩子,配合 lint-staged 的路径过滤,仅对受影响的子包运行检查,避免全量执行的性能浪费。
6. CI/CD 流水线集成
npm ci 不触发 prepare 脚本,天然跳过 Husky 安装。而在本地开发环境中自动激活,实现"开发时严格、CI 时灵活"的双轨策略。
7. 分支保护与发布流程
利用 pre-rebase、post-checkout 等钩子实现分支保护策略(如禁止在 main 分支直接 rebase)、分支切换后的依赖自动安装等自定义工作流。
开发与工程化
调试钩子
# 在钩子中插入 exit 1 测试是否正常触发
echo "exit 1" > .husky/pre-commit
git commit -m "test"
# 应被阻止
# 查看 core.hooksPath 是否正确设置
git config core.hooksPath
# 应输出 .husky
# 手动执行钩子脚本排查问题
bash .husky/pre-commit自定义初始化脚本
~/.config/husky/init.sh 在所有钩子执行前被加载,适合设置环境变量:
# ~/.config/husky/init.sh
# 为 GUI 客户端(VS Code、GitKraken 等)配置 Node 路径
export PATH="/usr/local/bin:$PATH"
source ~/.nvm/nvm.sh子目录项目配置
当项目代码不在仓库根目录时:
{
"scripts": {
"prepare": "cd .. && husky frontend/.husky"
}
}# frontend/.husky/pre-commit
cd frontend
npx lint-staged与 pnpm workspace 集成
// 根 package.json
{
"scripts": {
"prepare": "husky"
}
}// packages/app/package.json
{
"scripts": {
"prepare": "cd ../.. && husky packages/app/.husky"
}
}版本迁移
从 v4 迁移到 v9
# 1. 卸载旧版
npm uninstall husky
# 2. 安装新版
npm install -D husky
# 3. 初始化
npx husky init
# 4. 将原 package.json 中的 hooks 配置迁移到 .husky/ 文件
# 原:package.json → "hooks": { "pre-commit": "lint-staged" }
# 新:.husky/pre-commit → npx lint-staged
# 5. 替换旧环境变量
# HUSKY_GIT_PARAMS → 使用 $1、$2 等原生参数
# HUSKY_SKIP_HOOKS → HUSKY=0从 v8 迁移到 v9
# 1. 更新 package.json 中的 prepare 脚本
# 旧:"prepare": "husky install"
# 新:"prepare": "husky"
# 2. 移除钩子文件中的 shebang 和 husky.sh 引入
# 删除:#!/usr/bin/env sh
# 删除:. "$(dirname -- "$0")/_/husky.sh"
# 3. 保留实际命令即可性能与安全
性能特征
| 指标 | 数据 |
|---|---|
| 包体大小 | 2 kB(gzipped) |
| 运行时依赖 | 0 |
| 钩子启动耗时 | ~1ms |
| 执行模式 | 顺序执行(逐个命令) |
顺序执行特性说明:Husky 钩子内的多行命令按顺序执行。例如 pre-commit 中包含 3 个命令(ESLint 5s → Prettier 2s → tsc 8s),总耗时约 15s。若需要并行执行,应考虑 Lefthook 等替代方案。
安全考量
- 零供应链风险:无第三方依赖,不受 npm 供应链攻击影响
- 本地执行:钩子脚本存储在仓库内,可被代码审查追踪
- CI 隔离:
npm ci不触发prepare,CI 环境天然不受钩子影响 - 权限控制:钩子是标准 Shell 脚本,遵循操作系统文件权限模型
- MIT 许可:无任何许可证变更风险(v5 曾短暂更换为非 MIT 许可,v9 已恢复 MIT)
与 Lefthook 性能对比
| 场景 | Husky | Lefthook |
|---|---|---|
| 小型项目(<50 文件) | ~5s | ~2s |
| 中型项目(50–500 文件) | ~15s | ~8s(并行) |
| 大型项目(500+ 文件) | ~45s+ | ~15s(并行) |
性能差距主要来自 Lefthook 的并行执行能力和内置文件过滤,而非钩子触发层本身。
技术对比
主流 Git Hooks 工具对比
| 特性 | Husky | Lefthook | simple-git-hooks | pre-commit |
|---|---|---|---|---|
| 语言 | JavaScript | Go | JavaScript | Python |
| 包体大小 | 2 kB | ~10 MB(单二进制) | ~5 kB | 较大(Python 环境) |
| 运行时依赖 | 0 | 0(独立二进制) | 0 | Python 运行时 |
| 配置方式 | Shell 脚本(.husky/) | YAML(lefthook.yml) | package.json | YAML(.pre-commit-config.yaml) |
| 并行执行 | ❌ 顺序 | ✅ 原生并行 | ❌ 顺序 | ✅ 并行 |
| 文件过滤 | ❌ 需 lint-staged | ✅ 内置 {staged_files} | ❌ 需 lint-staged | ✅ 内置 |
| 自动 re-stage | ❌ | ✅ stage_fixed: true | ❌ | ✅ |
| Monorepo | 手动配置 | ✅ 一等支持 | ❌ | 手动配置 |
| 非 JS 项目 | ❌ 需 Node.js | ✅ 跨语言 | ❌ 需 Node.js | ✅ 跨语言 |
| npm 周下载量 | ~2600 万 | ~40 万 | ~30 万 | N/A(Python 生态) |
| GitHub Stars | 35.2k | ~5k | ~2k | ~13k |
| 学习曲线 | 低 | 中 | 低 | 中 |
| 生态成熟度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
选型建议
选 Husky 的场景:
- JavaScript/TypeScript 项目,尤其是 React/Vue/Next.js 生态
- 团队已熟悉 Husky + lint-staged + commitlint 组合
- 追求最大社区兼容性和教程资源
- 项目规模中小,顺序执行性能可接受
选 Lefthook 的场景:
- 大型代码库,顺序执行太慢(>500 文件)
- 多语言 Monorepo(Go + JS + Python 混合)
- 需要并行执行和内置文件过滤
- 希望用单个 YAML 文件替代多个 Shell 脚本
选 simple-git-hooks 的场景:
- 极小项目,只需 1–2 个简单钩子
- 不想引入任何额外目录结构
- 偏好
package.json内配置
选 pre-commit 的场景:
- Python 项目或跨语言项目
- 需要丰富的预置钩子生态(pre-commit.com 市场)
- 不依赖 npm/Node.js 环境
从 Husky 迁移到 Lefthook
# 1. 卸载 Husky
pnpm remove husky
rm -rf .husky/
# 2. 安装 Lefthook
pnpm add -D lefthook
# 3. 初始化
npx lefthook install
# 4. 创建 lefthook.yml
cat > lefthook.yml << 'EOF'
pre-commit:
parallel: true
commands:
eslint:
glob: "*.{js,ts,tsx}"
run: npx eslint {staged_files}
prettier:
glob: "*.{js,ts,tsx,css,md}"
run: npx prettier --write {staged_files}
stage_fixed: true
commit-msg:
commands:
commitlint:
run: npx commitlint --edit
EOF最佳实践
1. pre-commit 只做轻量检查,pre-push 做重量检查
# ✅ 推荐:pre-commit 用 lint-staged 做快速格式化
# .husky/pre-commit
npx lint-staged
# ✅ 推荐:pre-push 做全量类型检查和测试
# .husky/pre-push
npx tsc --noEmit
npx vitest run原因:
tsc --noEmit需要完整项目类型图,无法仅对暂存文件执行;放在 pre-commit 会显著拖慢提交流程。
2. 不要在钩子中使用 sudo 或危险操作
# ❌ 危险
sudo rm -rf node_modules
git push --force
# ✅ 安全
npx eslint --fix3. 为 GUI 客户端配置 Node 路径
VS Code、GitKraken 等 GUI 客户端可能无法识别 nvm/fnm 管理的 Node 版本:
# ~/.config/husky/init.sh
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"4. CI 环境优雅处理
{
"scripts": {
"prepare": "husky || true"
}
}或显式检测 CI 环境:
{
"scripts": {
"prepare": "node -e \"if(process.env.CI !== 'true') process.exit(0)\" && husky"
}
}5. 保持钩子脚本简洁
单个钩子文件不超过 10 行。复杂逻辑抽到独立脚本:
# ✅ 简洁的钩子
# .husky/pre-commit
node scripts/pre-commit.js
# ❌ 过于复杂的钩子
# .husky/pre-commit(超过 20 行逻辑)
files=$(git diff --name-only --cached)
for f in $files; do ... done
...6. 使用 lint-staged 缩小检查范围
// lint-staged.config.js
export default {
// 仅对暂存的 JS/TS 文件运行 ESLint
'*.{js,ts,tsx}': ['eslint --fix', 'prettier --write'],
// 仅对暂存的样式文件运行 Stylelint
'*.{css,scss,less}': ['stylelint --fix'],
// 对暂存的 Markdown 和 JSON 运行 Prettier
'*.{md,json}': ['prettier --write'],
}7. commitlint 使用 $1 参数
# .husky/commit-msg
# 必须传递 $1(Git 传入的提交信息临时文件路径)
npx --no -- commitlint --edit "$1"8. 团队协作约定
- 将
.husky/目录完整提交到 Git,确保所有开发者共享钩子配置 - 在 README 中说明
pnpm install会自动激活 Husky - 新成员 onboarding 时验证钩子是否生效:
git config core.hooksPath应输出.husky
技术局限与边界
1. 仅支持客户端钩子
Husky 只能管理 Git 客户端钩子(pre-commit、pre-push 等),不能管理服务器端钩子(如 pre-receive、post-receive)。服务器端钩子需要在 Git 服务器(如 Gitea、GitLab)上配置。
2. 顺序执行,无原生并行
Husky 钩子内的命令按顺序执行,不支持 parallel: true 等并行声明。对于大型项目,pre-commit 可能耗时较长。需要并行能力应使用 Lefthook 或在 Shell 脚本中自行编排后台进程。
3. 无内置文件过滤
Husky 不提供"仅对暂存文件执行检查"的能力。必须配合 lint-staged 或手动编写 git diff --cached 逻辑。这是 Husky + lint-staged 组合存在的原因。
4. 依赖 Node.js 环境
Husky 本身需要 Node.js 运行时。在纯 Go、Python 或 Ruby 项目中,使用 Husky 会强制要求开发者安装 Node.js。跨语言项目更适合 Lefthook 或 pre-commit。
5. Windows 兼容性细节
虽然 Husky 支持 Windows,但 Shell 脚本在 Windows 上依赖 Git Bash(MSYS2)执行。某些 Bash 特性(如 heredoc、进程替换)在不同 Windows 环境下行为可能不一致。建议钩子脚本保持 POSIX 兼容。
6. prepare 生命周期边界
npm install 带包名参数时(如 npm install lodash)不触发 prepare。团队成员如果习惯用 npm install <pkg> 而非 pnpm add <pkg>,可能不会触发钩子安装。建议使用 pnpm 或 yarn,它们的 prepare 触发行为更一致。
7. 不支持钩子内的钩子组合声明
不同于 Lefthook 的 YAML 声明式配置,Husky 的钩子就是纯 Shell 脚本,没有"先执行 A 组再执行 B 组"的条件编排语法。复杂编排需要自行在脚本中实现逻辑。
8. 版本迭代节奏
Husky 最新稳定版 v9.1.7 发布于 2024 年 11 月,截至 2026 年 7 月尚未发布 v10。作者 typicode 为独立维护者,更新节奏受个人精力影响,不像大型组织维护的项目那样高频迭代。
学习资源
官方资源
- 官方文档:https://typicode.github.io/husky/
- 快速开始:https://typicode.github.io/husky/get-started.html
- v4 迁移指南:https://typicode.github.io/husky/migrate-from-v4.html
- GitHub 仓库:https://github.com/typicode/husky
- GitHub Discussions:https://github.com/typicode/husky/discussions
中文资源
- Husky 中文网:https://husky.nodejs.cn/(社区翻译版)
- 如何 | Husky 中文网:https://husky.nodejs.cn/how-to.html
- 开源项目常用工具对比:husky vs simple-git-hooks:https://juejin.cn/post/7457571238465847334
- husky vs lefthook:新一代 Git Hooks 工具全面对比:https://zhuanlan.zhihu.com/p/1965134049912783993
英文教程
- Husky 9.0 Release: The Elegant Way of Using Git Hooks:https://levelup.gitconnected.com/husky-9-unleashed-simplifying-git-hooks-with-a-single-command-333fb6850469
- Migrating Husky to v9:https://javascript.plainenglish.io/migrating-husky-to-v9-33c1f02eb3a9
- Upgrading Husky from v8 to v9:https://rajendrasinh.com/posts/upgrade-from-husky-v8-to-v9/
- Lefthook vs Husky: Why I Switched:https://gazar.dev/devops/lefthook-vs-husky-git-hooks
- Git Hook Frameworks Comparison:https://www.andymadge.com/2026/03/10/git-hook-frameworks-comparison/
- Biome.js Git Hooks Recipe:https://biomejs.dev/recipes/git-hooks/
对比与评测
- Husky vs Lefthook vs lint-staged 2026:https://www.pkgpulse.com/guides/husky-vs-lefthook-vs-lint-staged-git-hooks-nodejs-2026
- Husky Deprecation and Modern Alternatives:https://fix-code-bugs.web.app/posts/git/husky-add-deprecation/
2026 年现状
市场地位
截至 2026 年 7 月,Husky 仍然是 JavaScript/TypeScript 生态中使用最广泛的 Git Hooks 管理工具:
- npm 周下载量:2600 万+
- GitHub Stars:35.2k
- 采用项目:React、Next.js、Vite、Vue、Nuxt、Astro 等顶级开源项目
v9.x 稳定期
Husky v9.1.7(2024 年 11 月发布)是当前最新稳定版。v9 系列已进入维护阶段,核心 API 趋于稳定:
husky init一键初始化成为标准prepare: "husky"生命周期完全取代旧式husky install- 钩子脚本回归纯 Shell,无 shebang 和 husky.sh 引入
v10 展望
v10 尚未正式发布,但官方已在 v9.1.1+ 中明确标注废弃警告:
Deprecated: The following lines will fail in v10.0.0.
Please remove them from your hook scripts:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
v10 预计将彻底移除对旧式钩子格式的支持,进一步简化内核。
竞争格局变化
2025–2026 年,Git Hooks 工具格局发生显著变化:
| 趋势 | 详情 |
|---|---|
| Lefthook 崛起 | Go 编写的单二进制工具,下载量从 ~10 万增长至 ~40 万/周,主打并行执行和跨语言支持 |
| Biome 内置钩子 | Biome(原 Rome)提供 biome ci 和内置 Git Hooks 集成,无需额外工具 |
| hk 新工具 | 2025 年出现的超高性能 Git Hooks 管理器,基准测试显示比 Lefthook 快 4.6 倍 |
| Husky 守成 | 凭借庞大的存量用户和生态惯性,Husky 仍是"默认选择",但新用户开始考虑替代方案 |
选型结论
| 场景 | 2026 年推荐 |
|---|---|
| 标准 Node.js 项目,团队已熟悉 Husky | Husky v9 — 成熟稳定,无迁移必要 |
| 大型 Monorepo,需要并行执行 | Lefthook — 性能优势明显 |
| 跨语言项目(Go + JS + Python) | Lefthook 或 pre-commit |
| 使用 Biome 的项目 | Biome 内置 — 无需额外工具 |
| 追求极致性能 | hk — 新兴选择,尚待验证 |
| 新项目,无历史包袱 | Husky v9 或 Lefthook — 均可 |
Husky 在 2026 年仍然是最安全、最稳妥的选择。它的价值不在于性能极限,而在于生态成熟度、社区惯性和零心智负担。对于大多数前端项目,Husky + lint-staged + commitlint 的三件套仍然是工程化的黄金组合。