本文目录导读:

- 核心思路
- 检查文件头部是否包含法律声明(如 Apache/MIT 许可证头)
- 检查提交信息是否包含法律认可(如 Signed-off-by)
- 检查新增代码中是否包含敏感或违禁法律词汇
- 检查文件是否包含特定法律要求(如出口管制声明)
- 高级:使用第三方工具进行自动化审查
- 注册与注意事项
- 完整脚本示例(检查版权 + 禁止敏感词)
Git 钩子脚本可以通过以下几种方式检查代码中是否包含或违反了特定的法律条款(如版权声明、许可证头、敏感词汇或合规要求):
核心思路
在 pre-commit 或 commit-msg 钩子中,使用 正则匹配、关键词黑名单 或 文件头校验 来扫描暂存区或提交信息。
检查文件头部是否包含法律声明(如 Apache/MIT 许可证头)
场景:确保所有 .py、.java 等源文件顶部必须包含公司或项目的法律版权声明。
示例脚本 (pre-commit):
#!/bin/bash
# 检查所有 .py 文件是否包含特定的版权声明
COPYRIGHT_HEADER="Copyright (c) 2024 Your Company. All rights reserved."
ERROR=0
for file in $(git diff --cached --name-only --diff-filter=ACM | grep '\.py$'); do
# 读取前5行
head -5 "$file" | grep -q "$COPYRIGHT_HEADER"
if [ $? -ne 0 ]; then
echo "❌ 法律条款缺失: $file 缺少版权声明"
ERROR=1
fi
done
if [ $ERROR -ne 0 ]; then
echo "请添加后重新提交"
exit 1
fi
检查提交信息是否包含法律认可(如 Signed-off-by)
场景:要求每次提交必须包含“Signed-off-by”或“法律许可”字段(常见于 Linux 内核或开源项目)。
示例脚本 (commit-msg):
#!/bin/bash
# 检查提交信息是否包含 "Signed-off-by:" 行
COMMIT_MSG_FILE=$1
if ! grep -q "^Signed-off-by:" "$COMMIT_MSG_FILE"; then
echo "❌ 提交信息缺少法律条款声明: 必须包含 'Signed-off-by: Your Name <email>'"
exit 1
fi
检查新增代码中是否包含敏感或违禁法律词汇
场景:禁止提交包含特定法律风险关键词(如专利号、未授权第三方库、公司机密代码)。
示例脚本 (pre-commit):
#!/bin/bash
# 定义法律敏感词(黑名单)
FORBIDDEN_PATTERNS=("confidential" "proprietary" "patent pending" "© 2023 Unauthorized")
# 仅检查暂存区中的改动行
git diff --cached --diff-filter=ACMR --name-only | while read file; do
# 使用逐行对比,避免误判已删除的旧行
git diff --cached -U0 "$file" | grep '^\+' | grep -v '^\+\+\+' | while read line; do
for pattern in "${FORBIDDEN_PATTERNS[@]}"; do
if echo "$line" | grep -qi "$pattern"; then
echo "❌ 检测到法律风险内容: $file 中包含 '$pattern'"
echo " 违规行: $line"
exit 1
fi
done
done
done
检查文件是否包含特定法律要求(如出口管制声明)
场景:某些加密或安全相关代码要求必须包含出口管制法律声明(如“This product includes cryptographic software...”)。
示例脚本:
#!/bin/bash
REQUIRED_STATEMENT="This software is subject to export control laws."
ERROR=0
for file in $(git diff --cached --name-only | grep -E '\.(c|h|java)$'); do
if ! grep -qF "$REQUIRED_STATEMENT" "$file"; then
echo "⚠️ 法律声明缺失: $file 中未包含出口管制声明"
ERROR=1
fi
done
exit $ERROR
高级:使用第三方工具进行自动化审查
如果只想用脚本做简单规则,可以使用以下方案:
-
pre-commit框架
编写自定义 Hook 插件,或使用现成的如check-added-large-files、detect-private-key等,结合法律规则。 -
License 检查
license-eye 或reuse工具可校验文件头是否符合 SPDX 标准。 -
GitLeaks / Talisman
检测密钥、密码或法律禁止嵌入的敏感信息(如 PCI-DSS 数据)。
注册与注意事项
-
放置位置
脚本放入.git/hooks/目录(如.git/hooks/pre-commit),并赋予执行权限:chmod +x .git/hooks/pre-commit
-
效率优化
- 仅扫描暂存区(
git diff --cached)而非整个仓库。 - 使用
--diff-filter=ACM仅检查新增、修改的文件。
- 仅扫描暂存区(
-
团队共享
将钩子脚本放入项目仓库的.githooks/目录,并配置:git config core.hooksPath .githooks
-
错误处理
不要直接exit 1导致无法使用--no-verify跳过,建议给出清晰提示。
完整脚本示例(检查版权 + 禁止敏感词)
#!/bin/bash
# .githooks/pre-commit — 法律合规检查
set -e
COPYRIGHT="© 2024 Acme Corp"
FORBIDDEN=("classified" "trade secret")
echo "🔍 正在执行法律条款检查..."
# 检查文件头版权
for file in $(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|py|java)$'); do
head -1 "$file" | grep -q "$COPYRIGHT" || {
echo "❌ $file: 缺少版权声明"
exit 1
}
done
# 检查暂存区新增行是否含敏感词
git diff --cached -U0 | awk '/^\+/{ print }' | while read line; do
for word in "${FORBIDDEN[@]}"; do
if echo "$line" | grep -qi "$word"; then
echo "❌ 检测到被禁止的法律词汇: '$word'"
echo " 行内容: $line"
exit 1
fi
done
done
echo "✅ 法律条款检查通过"
exit 0
通过以上方法,你可以将法律条款检查嵌入 Git 工作流,确保每次提交都符合合规要求,如需更复杂的规则(如动态读取许可证文件),可通过外部脚本调用实现。