Git钩子脚本如何检查创新计划

wen 实用脚本 1

本文目录导读:

Git钩子脚本如何检查创新计划

  1. 方法一:检查提交信息(Commit Message)是否关联创新计划
  2. 方法二:检查被修改的文件是否符合创新计划规范
  3. 方法三:检查是否引入了禁止的创新关键词(安全/合规检查)
  4. 如何配置和使用
  5. 高级技巧:使用 lint-stagedpre-commit 框架

这是一个非常具体且专业的Git钩子应用场景,要理解“检查创新计划”的Git钩子脚本,首先需要明确“创新计划”在代码层面具体指什么

这指的是以下一种或多种情况:

  1. 文件命名规范:所有与创新计划相关的文件必须放在特定目录或包含特定前缀(如 INNOVATION_)。
  2. 特殊注释标记:代码中必须包含特定的注释(如 @InnovationProject),或者禁止包含某些标签。
  3. 分支策略:只允许在特定的创新分支(如 innovation/xxx)上提交代码。
  4. 关键词扫描:禁止在非创新计划中引入某些敏感或特定的词汇/算法。
  5. 结对编程/联审标记:提交信息(Commit Message)必须包含“创新计划”相关的ID或审批人。

由于“创新计划”是一个业务术语,没有标准的技术定义,你需要先在团队内定义清楚“创新计划”的技术规范

以下我会提供三种最常见的实现思路和对应的Git钩子脚本(以pre-commitcommit-msg钩子为例),你可以根据你的实际需求选择或组合。


检查提交信息(Commit Message)是否关联创新计划

场景:团队规定,所有属于“创新计划”的提交,其提交信息必须以 [INNOVATION-计划编号] 开头。

脚本.git/hooks/commit-msg(无后缀,需赋予执行权限 chmod +x

#!/bin/bash
# 该钩子检查本次提交的commit message是否包含创新计划ID
commit_msg_file=$1
commit_msg=$(cat "$commit_msg_file")
# 定义正则:匹配 [INNOVATION-数字ID]
innovation_pattern='^\[INNOVATION-[0-9]+\]'
# 定义必须包含此标记的分支(只在特定分支上强制检查)
required_branch_pattern="innovation/"
current_branch=$(git rev-parse --abbrev-ref HEAD)
# 检查当前是否在创新分支上,或者是否整个仓库强制
if [[ "$current_branch" =~ $required_branch_pattern ]]; then
    if ! [[ "$commit_msg" =~ $innovation_pattern ]]; then
        echo "❌ 错误:当前分支 '$current_branch' 属于创新计划分支。"
        echo "提交信息必须以 '[INNOVATION-数字编号]' 开头。"
        echo "[INNOVATION-1234] 实现了一个新的推荐算法"
        exit 1
    fi
fi
# 如果不检查分支,强制所有提交都包含
# if ! [[ "$commit_msg" =~ $innovation_pattern ]]; then
#     echo "❌ 错误:请为本次创新计划的修改添加计划编号。"
#     exit 1
# fi
exit 0

检查被修改的文件是否符合创新计划规范

场景:团队规定,所有创新计划的文件必须放在 /src/innovation/ 目录下,或包含 .innovation.md 后缀。

脚本.git/hooks/pre-commit

#!/bin/bash
# 该钩子检查即将提交的文件是否位于正确的创新计划目录下
echo "🔍 检查创新计划目录规范..."
# 获取暂存区中所有文件的列表
files=$(git diff --cached --name-only)
# 定义创新计划的根目录(可修改)
INNOVATION_ROOT="src/innovation/"
# 定义错误标志
error_flag=0
for file in $files; do
    # 如果文件在临时改动区或非创新目录内出现了类似"创新计划"的关键词
    # 检查非创新目录下的文件是否包含了 "TODO: INNOVATION" 注释
    # 方案A:严格检查目录位置
    # (这里可以写更复杂的逻辑,所有.py文件必须分类)
    # 方案B:检查文件内容是否包含创新标记
    # 如果这个文件不在创新计划目录,但却包含 "innovation_project" 函数名
    if [[ "$file" != $INNOVATION_ROOT* ]]; then
        # 读取暂存区的内容进行关键字扫描
        # 使用 `git show :$file` 可以查看暂存区版本
        if git show :"$file" | grep -q "INNOVATION_PROJECT_ID"; then
            echo "❌ 错误:文件 '$file' 不在创新计划目录 ($INNOVATION_ROOT) 内,"
            echo "   但该文件包含 'INNOVATION_PROJECT_ID' 关键词。"
            echo "   请将文件移动到正确的目录或移除关键词。"
            error_flag=1
        fi
    fi
done
# 方案C:检查是否有新文件被添加,但缺少对应的创新计划文档
for file in $files; do
    if [[ "$file" == $INNOVATION_ROOT* ]]; then
        # 新添加的创新文件必须附带一个设计文档
        doc_file="${file%.*}.innovation.md"
        if ! echo "$files" | grep -q "$doc_file"; then
            echo "⚠️ 警告:你在创新目录添加了 '$file',但未发现对应的设计文档 '$doc_file'。"
            echo "   如果是正式提交,建议补全文档。"
            # 如果希望强制检查,可以将 warning 改为 error
            # error_flag=1
        fi
    fi
done
if [[ "$error_flag" -eq 1 ]]; then
    echo "❌ 提交被拒绝,请修正以上创新计划相关的问题。"
    exit 1
fi
exit 0

检查是否引入了禁止的创新关键词(安全/合规检查)

场景:某些项目(如AI大模型、前沿算法)包含高风险创新代码,不允许混入主分支,需要确保主分支的提交不包含特定创新关键词。

脚本.git/hooks/pre-commit(在 mainmaster 分支生效)

#!/bin/bash
# 该钩子禁止在主分支上提交带有“实验性”创新内容的代码
current_branch=$(git rev-parse --abbrev-ref HEAD)
# 只在主分支上检查
if [[ "$current_branch" == "main" ]] || [[ "$current_branch" == "master" ]]; then
    echo "🔍 主分支创新计划合规检查..."
    # 定义禁止出现的关键词列表
    forbidden_patterns=("experimental_algorithm" "UNSTABLE_API" "INNOVATION_REVIEW_PENDING")
    files=$(git diff --cached --name-only)
    for file in $files; do
        # 跳过二进制文件
        if [[ "$file" =~ \.(png|jpg|pdf|exe|dll)$ ]]; then
            continue
        fi
        # 获取暂存区内容并检查
        content=$(git show :"$file")
        for pattern in "${forbidden_patterns[@]}"; do
            if echo "$content" | grep -q "$pattern"; then
                echo "❌ 错误:文件 '$file' 包含创新计划的关键词 '$pattern'。"
                echo "   主分支不允许包含未经发布审批的创新内容。"
                echo "   如需开发,请切换到 innovation/ 分支。"
                exit 1
            fi
        done
    done
fi
exit 0

如何配置和使用

  1. 创建钩子文件:进入你的Git仓库目录下的 .git/hooks/ 目录。
  2. 创建脚本:例如创建 pre-commitcommit-msg 文件。
  3. 赋予可执行权限
    chmod +x .git/hooks/pre-commit
  4. 测试
    git add some_file.py
    git commit -m "test"  # 钩子会阻止或警告

高级技巧:使用 lint-stagedpre-commit 框架

对于复杂的“创新计划”检查,建议使用专业工具:

  • Husky + lint-staged:在前端/Node项目中很流行,可以配置在提交前运行特定的lint检查(检查文件名、文件内容)。
  • pre-commit (Python框架):可以配置现成的hook(如check-added-large-filescheck-yaml),也可以编写自定义的Python脚本进行复杂的规则匹配。

最后提醒:Git钩子是本地的,每个开发者拉取代码后需要自行安装(可以使用husky installmake命令自动化),如果需要服务器端强约束,请使用GitLab/GitHub的Protect Branch规则Git Hooks服务器端版本

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