本文目录导读:

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 工具管理钩子
- 版本控制:将钩子配置文件纳入版本控制
通过这些方法,可以有效确保团队成员提交的代码符合项目规范。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播