#!/bin/sh ################### # 配置区域开始 ################### # 检查规则配置 FORBIDDEN_PATTERNS=( "Forbidden to commit:检查到禁止提交的标记" ) # 特定目录的检查规则 DIRECTORY_RULES=( "ProjectNLD/Assets/Code/:using NPOI:检查到禁止的 NPOI 引用" "ProjectNLD/Assets/Code/:using dnlib:检查到禁止的 dnlib 引用" ) # 文件类型限制 FILE_PATTERNS=( "\.cs$" ) ################### # 配置区域结束 ################### echo "开始执行 pre-commit 检查..." # 检查文件是否匹配指定模式 is_target_file() { local file="$1" for pattern in "${FILE_PATTERNS[@]}"; do if [[ "$file" =~ $pattern ]]; then return 0 fi done return 1 } # 检查通用禁止模式 check_forbidden_patterns() { local file="$1" for rule in "${FORBIDDEN_PATTERNS[@]}"; do local pattern="${rule%%:*}" local message="${rule#*:}" if git diff --cached --unified=0 -- "$file" | grep -v '^-' | grep -q "$pattern"; then echo "错误: $file $message" return 1 fi done return 0 } # 检查目录特定规则 check_directory_rules() { local file="$1" for rule in "${DIRECTORY_RULES[@]}"; do local dir="${rule%%:*}" local remaining="${rule#*:}" local pattern="${remaining%%:*}" local message="${remaining#*:}" if [[ $file == *"$dir"* ]]; then if git diff --cached --unified=0 -- "$file" | grep -v '^-' | grep -q "$pattern"; then echo "错误: $file $message" return 1 fi fi done return 0 } # 检查单个文件 check_file() { local file="$1" # 检查文件类型 if ! is_target_file "$file"; then return 0 fi echo "检查文件: $file" # 检查禁止模式 if ! check_forbidden_patterns "$file"; then return 1 fi # 检查目录规则 if ! check_directory_rules "$file"; then return 1 fi return 0 } # 主检查函数 main() { local exit_code=0 local files # 获取所有待提交的文件 files=$(git diff --cached --name-only) # 逐个检查文件 for file in $files; do if ! check_file "$file"; then exit_code=1 break fi done if [ $exit_code -eq 1 ]; then echo "❌ pre-commit 检查失败,提交已取消" return 1 else echo "✅ pre-commit 检查通过,允许提交" return 0 fi } main exit $?