学无止境

少年辛苦终身事,莫向光阴惰寸功。——唐·杜荀鹤《题弟侄书堂》


Python代码审查的Git Hook实现指南

Git Hook简介

Git Hook是在Git操作(如commit、push等)执行前后自动运行的脚本,可用于实现代码质量控制、工作流程自动化等功能。本文将介绍如何利用Git Hook实现Python代码的自动审查。

实现步骤

1. 环境准备

在开始之前,请确保已安装以下工具:

  • Python 3.11或更高版本
  • poetry
  • Git

安装所需的Python包:

poetry add ruff mypy

2. 项目配置

编辑配置文件

编辑pyproject.toml文件,配置代码检查工具。

Ruff配置
[tool.ruff.lint]
select = [
    "E",  # pycodestyle错误
    "W",  # pycodestyle警告
    "F",  # pyflakes
    "I",  # isort
    "B",  # flake8-bugbear
    "C4", # flake8-comprehensions
    "UP", # pyupgrade
    "ARG001", # 未使用的函数参数检查
]
ignore = [
    "E501", # 行长度超限(由black处理)
    "B008", # 函数参数默认值中的函数调用
    "W191", # 使用tab缩进
    "B904", # 允许不带from子句的异常抛出
]

[tool.ruff.lint.pyupgrade]
keep-runtime-typing = true  # 保留运行时类型注解

[tool.ruff.format]
quote-style = "double"  # 使用双引号
Mypy配置
[tool.mypy]
python_version = "3.11"
install_types = true
check_untyped_defs = true
files = ["*.py"]
allow_redefinition = true

[[tool.mypy.overrides]]
module = "isodate.*"
ignore_missing_imports = true

3. Git Hook脚本设置

创建安装脚本

在项目根目录创建.script文件夹,并添加以下安装脚本:

#!/bin/bash
# .script/setup.sh
set -e
PROJECT_ROOT=$(git rev-parse --show-toplevel)

setup_hook() {
    local name=$1
    local hook_path="${PROJECT_ROOT}/.git/hooks/${name}"
    local script_path="${PROJECT_ROOT}/.script/${name}.sh"
    
    mkdir -p "${PROJECT_ROOT}/.git/hooks"
    
    cat > "$hook_path" << EOF
#!/bin/bash
set -e
bash "${script_path}"
EOF
    
    chmod +x "$hook_path"
    echo "成功设置 ${hook_path}"
}

setup_hook "pre-commit"

创建pre-commit脚本

.script文件夹中创建pre-commit脚本:

#!/bin/bash
# .script/pre-commit.sh
set -e
PROJECT_ROOT_DIR=$(git rev-parse --show-toplevel)
cd $PROJECT_ROOT_DIR

# 获取待提交的Python文件
py_files=$(git --no-pager diff --cached --name-only --diff-filter=d | grep '\.py$' || true)

if [ ! -z "$py_files" ]; then
    # 代码格式化和自动修复
    ruff format
    ruff check --fix
    
    # 重新添加修改后的文件
    echo "$py_files" | while read file; do
        if [ ! -z "$file" ]; then
            git add "$file"
        fi
    done
    
    # 最终代码检查
    ruff check
    mypy
fi

4. 部署步骤

  1. 为脚本添加执行权限:
chmod +x .script/setup.sh
chmod +x .script/pre-commit.sh
  1. 运行安装脚本:
.script/setup.sh

5. 工作原理

  • 当执行git commit时,pre-commit hook会自动运行
  • 对暂存区中的Python文件进行以下处理:
    • 使用ruff进行代码格式化
    • 自动修复可修复的代码问题
    • 运行代码质量检查
    • 执行类型检查
  • 如果检查未通过,commit将被阻止

6. 注意事项

  • 确保所有团队成员都安装了必要的依赖包
  • 建议在项目README中说明代码规范和Hook的使用方法
  • 可根据项目需求调整ruff和mypy的配置规则