Git钩子脚本如何检查公平性门禁

wen 实用脚本 2

本文目录导读:

Git钩子脚本如何检查公平性门禁

  1. 检查代码风格与静态分析(基础公平性)
  2. 检查敏感信息泄露(安全公平性门禁)
  3. 检查大文件或二进制文件(资源公平性门禁)
  4. 检查提交信息规范(流程公平性门禁)
  5. 集成专业公平性检查(高级门禁)
  6. 如何部署这些钩子?
  7. 注意事项

Git 钩子脚本可以用来检查代码提交中的“公平性门禁”(代码规范、敏感信息泄露、算法偏见等),通常推荐使用 pre-commitpre-push 钩子来实现。

以下是几种常见的公平性门禁检查场景及其对应的 Git 钩子脚本实现思路:

检查代码风格与静态分析(基础公平性)

确保代码符合团队统一风格,避免“代码歧视”(如某些开发者偏好个人风格而非团队规范)。

示例:pre-commit 钩子(使用 ESLint 和 Prettier)

#!/bin/bash
# .git/hooks/pre-commit
echo "🔍 检查代码风格与潜在错误..."
# 获取暂存区中的 JS/TS 文件
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|jsx|tsx)$')
if [ -n "$STAGED_FILES" ]; then
  # 运行 ESLint(检查语法和公平性规则)
  npx eslint $STAGED_FILES --quiet
  if [ $? -ne 0 ]; then
    echo "❌ 代码存在不公平或不规范的写法,请修复后重新提交。"
    exit 1
  fi
  # 运行 Prettier(统一格式)
  npx prettier --check $STAGED_FILES
  if [ $? -ne 0 ]; then
    echo "❌ 代码格式不符合标准,请运行 'npm run format'。"
    exit 1
  fi
fi
exit 0

检查敏感信息泄露(安全公平性门禁)

防止密码、API Key、证书等敏感信息被提交,确保所有开发者都受到相同的安全保护。

示例:pre-commit 钩子(使用 grep)

#!/bin/bash
# .git/hooks/pre-commit
echo "🔒 检查敏感信息泄露..."
# 检查暂存区文件是否包含常见敏感模式
if git diff --cached --name-only | xargs grep -q -E '(password|api.?key|secret|ssh-rsa|BEGIN (RSA|EC|OPENSSH) PRIVATE KEY)'; then
  echo "❌ 提交中包含疑似敏感信息(密码、密钥等),已拒绝提交。"
  exit 1
fi
exit 0

进阶方案:使用 git-secretstalisman 等专业工具。


检查大文件或二进制文件(资源公平性门禁)

防止大型资源文件(如视频、数据集、模型权重)被提交,避免影响团队其他人的克隆与构建效率。

示例:pre-push 钩子

#!/bin/bash
# .git/hooks/pre-push
echo "📦 检查过大文件... (>5MB)"
MAX_SIZE=5242880 # 5MB
# 检查即将 push 的提交中是否有大文件
git rev-list --objects --all | \
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
  awk -v max=$MAX_SIZE '/^blob/ && $3 > max { print $4 " (" $3 " bytes)" }' | \
  while read line; do
    echo "❌ 发现大文件: $line"
    exit 1
  done
exit 0

检查提交信息规范(流程公平性门禁)

强制要求所有提交都必须遵循统一的提交信息格式(如 Conventional Commits),避免“特权提交”。

示例:commit-msg 钩子

#!/bin/bash
# .git/hooks/commit-msg
COMMIT_MSG=$(cat $1)
# 检查是否匹配 Conventional Commits 格式
if ! echo "$COMMIT_MSG" | grep -qE '^(feat|fix|docs|style|refactor|test|chore|ci|perf)(\(.+\))?: .{1,50}$'; then
  echo "❌ 提交信息不符合规范。"
  echo "示例: feat(user): add login feature"
  echo "      fix(api): resolve timeout bug"
  exit 1
fi
exit 0

集成专业公平性检查(高级门禁)

对于机器学习项目,可能需要检查数据集的偏见或模型公平性,虽然这类检查通常不在 Git 钩子中直接执行(因为运行时间长),但可以做一个轻量触发检查:

示例:pre-commit 钩子(仅提示)

#!/bin/bash
# 检测是否有新增数据集文件
if git diff --cached --name-only | grep -E '\.(csv|json|parquet)$'; then
  echo "⚠️  检测到数据集文件变更,请确保已运行公平性分析脚本。"
  echo "   运行: python scripts/check_fairness.py --data-path <file>"
  # 可以强制阻塞
  read -p "确认已检查公平性?(y/N): " -n 1 -r
  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo -e "\n❌ 请先检查公平性再提交。"
    exit 1
  fi
fi
exit 0

如何部署这些钩子?

手动复制到 .git/hooks/

cp pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit

使用 Git 模板目录(团队共享) 创建一个 hooks 目录,然后在项目初始化时指定模板目录:

git init --template=/path/to/your/template

使用 husky(推荐) 对于 JavaScript/TypeScript 项目,使用 Husky 可以方便地在 package.json 中管理钩子:

npx husky init
echo "npx eslint --quiet" > .husky/pre-commit

注意事项

  1. 绕过风险:用户可以通过 git commit --no-verify 绕过钩子,因此这些钩子更适合做“提醒和规范”而非强制安全屏障。
  2. 性能影响:不要在钩子中执行耗时过长的检查(如完整单元测试),建议只做静态分析或预检查。
  3. 跨平台兼容:如果团队有 Windows 用户,考虑使用 node.jspython 脚本来编写钩子,而不是纯 Shell。

通过组合以上钩子,你可以构建一个比较完整的“公平性门禁”体系,确保代码提交在风格、安全、资源、流程和伦理层面都符合团队标准。

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