本文目录导读:

- 方法一:检查提交信息(Commit Message)是否关联创新计划
- 方法二:检查被修改的文件是否符合创新计划规范
- 方法三:检查是否引入了禁止的创新关键词(安全/合规检查)
- 如何配置和使用
- 高级技巧:使用
lint-staged或pre-commit框架
这是一个非常具体且专业的Git钩子应用场景,要理解“检查创新计划”的Git钩子脚本,首先需要明确“创新计划”在代码层面具体指什么。
这指的是以下一种或多种情况:
- 文件命名规范:所有与创新计划相关的文件必须放在特定目录或包含特定前缀(如
INNOVATION_)。 - 特殊注释标记:代码中必须包含特定的注释(如
@InnovationProject),或者禁止包含某些标签。 - 分支策略:只允许在特定的创新分支(如
innovation/xxx)上提交代码。 - 关键词扫描:禁止在非创新计划中引入某些敏感或特定的词汇/算法。
- 结对编程/联审标记:提交信息(Commit Message)必须包含“创新计划”相关的ID或审批人。
由于“创新计划”是一个业务术语,没有标准的技术定义,你需要先在团队内定义清楚“创新计划”的技术规范。
以下我会提供三种最常见的实现思路和对应的Git钩子脚本(以pre-commit和commit-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(在 main 或 master 分支生效)
#!/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
如何配置和使用
- 创建钩子文件:进入你的Git仓库目录下的
.git/hooks/目录。 - 创建脚本:例如创建
pre-commit或commit-msg文件。 - 赋予可执行权限:
chmod +x .git/hooks/pre-commit
- 测试:
git add some_file.py git commit -m "test" # 钩子会阻止或警告
高级技巧:使用 lint-staged 或 pre-commit 框架
对于复杂的“创新计划”检查,建议使用专业工具:
- Husky + lint-staged:在前端/Node项目中很流行,可以配置在提交前运行特定的lint检查(检查文件名、文件内容)。
- pre-commit (Python框架):可以配置现成的hook(如
check-added-large-files、check-yaml),也可以编写自定义的Python脚本进行复杂的规则匹配。
最后提醒:Git钩子是本地的,每个开发者拉取代码后需要自行安装(可以使用husky install或make命令自动化),如果需要服务器端强约束,请使用GitLab/GitHub的Protect Branch规则或Git Hooks服务器端版本。