Skip to content

Git Hooks 管理

Husky 是一个用于管理 Git hooks 的工具,可以在 Git 操作的不同阶段自动执行脚本,确保代码质量和团队协作规范。本指南将详细介绍如何在 VUP 项目中使用 Husky。

什么是 Husky

Husky 是一个 Git hooks 管理工具,提供:

  • Git Hooks 管理 - 统一管理所有 Git hooks
  • 团队协作 - 确保团队成员使用相同的代码规范
  • 自动化检查 - 在提交前自动运行代码检查
  • 灵活配置 - 支持多种脚本和工具
  • 易于维护 - 简单的配置和管理方式

快速开始

VUP 项目已经预配置了 Husky,开箱即用:

1. 查看现有配置

bash
# 查看 .husky 目录
ls .husky/

# 查看现有 hooks
cat .husky/pre-commit
cat .husky/pre-push

2. 启用 Git Hooks

bash
# 确保 hooks 已安装
pnpm husky install

# 检查 hooks 权限
chmod +x .husky/*

支持的 Git Hooks

pre-commit

在提交前执行,用于代码检查:

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

# 运行 lint-staged
pnpm lint-staged

pre-push

在推送前执行,用于运行测试:

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

# 运行测试
pnpm test

commit-msg

在提交信息验证时执行:

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

# 验证提交信息格式
npx commitlint --edit $1

post-commit

在提交后执行:

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

# 提交后通知
echo "提交成功!"

项目配置

package.json 配置

json
{
  "scripts": {
    "prepare": "husky install",
    "lint-staged": "lint-staged"
  },
  "lint-staged": {
    "*.{js,ts,tsx,vue}": ["eslint --fix", "prettier --write"],
    "*.{json,md}": ["prettier --write"]
  }
}

.husky 目录结构

.husky/
├── _/
│   └── husky.sh
├── pre-commit
├── pre-push
├── commit-msg
└── post-commit

常用配置

代码格式化

bash
# pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# 运行 ESLint 和 Prettier
pnpm lint-staged

测试检查

bash
# pre-push
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# 运行测试
pnpm test

# 运行类型检查
pnpm type-check

提交信息验证

bash
# commit-msg
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# 验证提交信息格式
npx commitlint --edit $1

构建检查

bash
# pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# 检查构建
pnpm build

高级配置

条件执行

bash
# pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# 只在特定文件变更时运行
if git diff --cached --name-only | grep -q "src/"; then
  pnpm lint-staged
fi

多环境支持

bash
# pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# 根据环境执行不同命令
if [ "$NODE_ENV" = "development" ]; then
  pnpm lint-staged
else
  pnpm lint-staged --strict
fi

错误处理

bash
# pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# 运行命令并处理错误
if ! pnpm lint-staged; then
  echo "代码检查失败,请修复后重新提交"
  exit 1
fi

团队协作

新成员加入

bash
# 克隆项目后安装依赖
pnpm install

# 自动安装 hooks(通过 prepare 脚本)
# 无需手动执行 husky install

配置同步

bash
# 提交 hooks 配置
git add .husky/
git commit -m "chore: add husky hooks"

# 推送到远程仓库
git push origin main

新成员加入

bash
# 新成员克隆项目
git clone <repository-url>
cd project

# 安装依赖(自动安装 hooks)
pnpm install

最佳实践

1. 选择合适的 Hooks

  • pre-commit: 代码格式化和基础检查
  • pre-push: 运行测试和类型检查
  • commit-msg: 验证提交信息格式
  • post-commit: 提交后通知或清理

2. 性能优化

  • 只检查变更的文件
  • 使用缓存机制
  • 避免运行耗时的操作

3. 错误处理

  • 提供清晰的错误信息
  • 支持跳过 hooks 的选项
  • 记录详细的日志

4. 团队规范

  • 统一 hooks 配置
  • 文档化使用说明
  • 定期更新和维护

常见问题

问题 1: Hooks 不执行

原因: Husky 未正确安装或配置

解决方案:

bash
# 重新安装 Husky
pnpm remove husky
pnpm add -D husky
pnpm husky install

# 检查 hooks 权限
chmod +x .husky/pre-commit

问题 2: 权限错误

原因: Hooks 文件没有执行权限

解决方案:

bash
# 添加执行权限
chmod +x .husky/*

# 或者使用 Git 配置
git config core.hooksPath .husky

问题 3: 命令找不到

原因: 环境变量或路径问题

解决方案:

bash
# 使用完整路径
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# 使用 pnpm 执行
pnpm exec eslint --fix

问题 4: 跳过 Hooks

原因: 需要临时跳过检查

解决方案:

bash
# 跳过 pre-commit
git commit --no-verify -m "紧急修复"

# 跳过 pre-push
git push --no-verify

相关工具

lint-staged

只对暂存的文件运行 linters:

json
{
  "lint-staged": {
    "*.{js,ts,tsx}": ["eslint --fix", "prettier --write"]
  }
}

commitlint

验证提交信息格式:

json
{
  "commitlint": {
    "extends": ["@commitlint/config-conventional"]
  }
}

pretty-quick

快速格式化代码:

bash
# 格式化暂存的文件
npx pretty-quick --staged

相关资源