本文目录导读:

Git钩子脚本可以通过多种方式检查代码规范,以下是几种常见的实现方法:
使用 pre-commit 钩子进行检查
基本示例(JavaScript项目)
#!/bin/bash
# .git/hooks/pre-commit
echo "Running code style checks..."
# 获取暂存的文件
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|jsx|ts|tsx)$')
if [ -z "$STAGED_FILES" ]; then
echo "No JavaScript/TypeScript files to check"
exit 0
fi
# 运行 ESLint 检查
echo "Running ESLint..."
npx eslint $STAGED_FILES --quiet
if [ $? -ne 0 ]; then
echo "ESLint check failed. Please fix the issues before committing."
exit 1
fi
# 运行 Prettier 检查
echo "Running Prettier..."
npx prettier --check $STAGED_FILES
if [ $? -ne 0 ]; then
echo "Prettier check failed. Please format the code."
exit 1
fi
echo "All checks passed!"
使用 husky 自动管理钩子
安装 husky
npm install husky --save-dev npx husky install
配置 husky 钩子
// package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"pre-push": "npm test"
}
}
}
结合 lint-staged
// package.json
{
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"*.{json,md,yml}": [
"prettier --write"
]
}
}
Python项目的代码规范检查
#!/bin/bash
# .git/hooks/pre-commit (Python项目)
echo "Running Python code style checks..."
# 获取暂存的Python文件
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.py$')
if [ -z "$STAGED_FILES" ]; then
exit 0
fi
# 运行 flake8 检查
echo "Running flake8..."
flake8 $STAGED_FILES --max-line-length=88
if [ $? -ne 0 ]; then
echo "Flake8 check failed. Please fix style issues."
exit 1
fi
# 运行 black 格式检查
echo "Running black..."
black --check $STAGED_FILES
if [ $? -ne 0 ]; then
echo "Black formatting check failed."
exit 1
fi
# 运行 mypy 类型检查
echo "Running mypy..."
mypy $STAGED_FILES
if [ $? -ne 0 ]; then
echo "Type check failed."
exit 1
fi
多语言项目综合检查
#!/bin/bash
# .git/hooks/pre-commit
echo "=== Code Quality Check ==="
# 获取所有暂存的文件
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
if [ -z "$STAGED_FILES" ]; then
echo "No files to check"
exit 0
fi
# 按文件类型分类检查
ERRORS=0
# JavaScript/TypeScript 检查
JS_FILES=$(echo "$STAGED_FILES" | grep -E '\.(js|jsx|ts|tsx)$')
if [ -n "$JS_FILES" ]; then
echo "Checking JavaScript/TypeScript files..."
npx eslint $JS_FILES --quiet
if [ $? -ne 0 ]; then
ERRORS=$((ERRORS + 1))
fi
fi
# Python 检查
PY_FILES=$(echo "$STAGED_FILES" | grep -E '\.py$')
if [ -n "$PY_FILES" ]; then
echo "Checking Python files..."
flake8 $PY_FILES
if [ $? -ne 0 ]; then
ERRORS=$((ERRORS + 1))
fi
fi
# CSS/SCSS 检查
CSS_FILES=$(echo "$STAGED_FILES" | grep -E '\.(css|scss)$')
if [ -n "$CSS_FILES" ]; then
echo "Checking CSS files..."
npx stylelint $CSS_FILES
if [ $? -ne 0 ]; then
ERRORS=$((ERRORS + 1))
fi
fi
if [ $ERRORS -gt 0 ]; then
echo "Code quality check failed. Please fix $ERRORS issue(s)."
exit 1
fi
echo "All checks passed!"
配置文件驱动的检查
创建检查配置文件
# .codecheck.yml
checks:
eslint:
enabled: true
extensions: ['.js', '.jsx', '.ts', '.tsx']
config: '.eslintrc.json'
prettier:
enabled: true
extensions: ['.js', '.json', '.md']
config: '.prettierrc'
flake8:
enabled: true
extensions: ['.py']
max_line_length: 120
stylelint:
enabled: true
extensions: ['.css', '.scss']
动态加载配置的钩子
#!/bin/bash
# .git/hooks/pre-commit
# 加载配置文件
CONFIG_FILE=".codecheck.yml"
if [ ! -f "$CONFIG_FILE" ]; then
echo "No config file found, skipping checks"
exit 0
fi
# 获取暂存文件
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
if [ -z "$STAGED_FILES" ]; then
exit 0
fi
# 解析配置文件并执行检查
# 这里需要根据实际的配置格式解析
echo "Running checks based on configuration..."
# 检查 ESLint 配置
if grep -q "eslint:" "$CONFIG_FILE"; then
JS_FILES=$(echo "$STAGED_FILES" | grep -E '\.(js|jsx|ts|tsx)$')
if [ -n "$JS_FILES" ]; then
npx eslint $JS_FILES
fi
fi
# 添加更多检查...
高级功能:增量检查和修复
#!/bin/bash
# .git/hooks/pre-commit
# 获取新增和修改的文件
MODIFIED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
# 临时存储检查结果
TEMP_FILE=$(mktemp)
trap "rm -f $TEMP_FILE" EXIT
# 并行执行检查
check_file() {
local file=$1
local ext="${file##*.}"
case "$ext" in
js|jsx|ts|tsx)
npx eslint --quiet "$file" 2>/dev/null
;;
py)
flake8 "$file" 2>/dev/null
;;
css|scss)
npx stylelint "$file" 2>/dev/null
;;
esac
if [ $? -ne 0 ]; then
echo "$file failed" >> "$TEMP_FILE"
fi
}
# 并行检查文件
export -f check_file
echo "$MODIFIED_FILES" | xargs -P 4 -I {} bash -c 'check_file "$@"' _ {}
# 检查结果
if [ -s "$TEMP_FILE" ]; then
echo "The following files failed checks:"
cat "$TEMP_FILE"
exit 1
fi
echo "All checks passed!"
最佳实践建议
- 保持快速:钩子应该快速执行,避免长时间阻塞提交
- 只检查变更:只检查暂存的文件,不要扫描整个项目
- 提供清晰信息:给出具体的错误信息和修复建议
- 允许跳过:提供
--no-verify选项用于紧急情况 - 团队共享:使用 husky 或 pre-commit 工具管理钩子
- 版本控制:将钩子配置文件纳入版本控制
通过这些方法,可以有效确保团队成员提交的代码符合项目规范。