本文目录导读:

- 检查代码风格与静态分析(基础公平性)
- 检查敏感信息泄露(安全公平性门禁)
- 检查大文件或二进制文件(资源公平性门禁)
- 检查提交信息规范(流程公平性门禁)
- 集成专业公平性检查(高级门禁)
- 如何部署这些钩子?
- 注意事项
Git 钩子脚本可以用来检查代码提交中的“公平性门禁”(代码规范、敏感信息泄露、算法偏见等),通常推荐使用 pre-commit 或 pre-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-secrets 或 talisman 等专业工具。
检查大文件或二进制文件(资源公平性门禁)
防止大型资源文件(如视频、数据集、模型权重)被提交,避免影响团队其他人的克隆与构建效率。
示例: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
注意事项
- 绕过风险:用户可以通过
git commit --no-verify绕过钩子,因此这些钩子更适合做“提醒和规范”而非强制安全屏障。 - 性能影响:不要在钩子中执行耗时过长的检查(如完整单元测试),建议只做静态分析或预检查。
- 跨平台兼容:如果团队有 Windows 用户,考虑使用
node.js或python脚本来编写钩子,而不是纯 Shell。
通过组合以上钩子,你可以构建一个比较完整的“公平性门禁”体系,确保代码提交在风格、安全、资源、流程和伦理层面都符合团队标准。