Git钩子脚本如何检查代码规范

wen 实用脚本 1

本文目录导读:

Git钩子脚本如何检查代码规范

  1. 使用 pre-commit 钩子进行检查
  2. 使用 husky 自动管理钩子
  3. Python项目的代码规范检查
  4. 多语言项目综合检查
  5. 配置文件驱动的检查
  6. 高级功能:增量检查和修复
  7. 最佳实践建议

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!"

最佳实践建议

  1. 保持快速:钩子应该快速执行,避免长时间阻塞提交
  2. 只检查变更:只检查暂存的文件,不要扫描整个项目
  3. 提供清晰信息:给出具体的错误信息和修复建议
  4. 允许跳过:提供 --no-verify 选项用于紧急情况
  5. 团队共享:使用 husky 或 pre-commit 工具管理钩子
  6. 版本控制:将钩子配置文件纳入版本控制

通过这些方法,可以有效确保团队成员提交的代码符合项目规范。

抱歉,评论功能暂时关闭!