svn服务端需通过pre-commit钩子实现敏感词拦截:脚本接收仓库路径和事务号,用svnlook获取变更文件,跳过二进制及忽略类型文件,对源码类文件逐行grep敏感词,命中则输出错误至stderr并exit 1,部署前须本地测试且使用绝对路径调用命令。

SVN服务端本身不内置敏感词拦截功能,必须通过预提交钩子(pre-commit hook)实现。核心思路是:在代码真正写入版本库前,由钩子脚本扫描待提交文件内容,发现匹配的敏感词就中止提交并返回错误信息。
编写 pre-commit 钩子脚本
进入 SVN 仓库的 hooks 目录(如 /path/to/repo/hooks/),复制模板并赋予可执行权限:
- 将
pre-commit.tmpl复制为pre-commit - 用
chmod +x pre-commit设置执行权限(Linux/macOS)或确保 Windows 下能被调用 - 脚本需接收两个参数:
$1是仓库路径,$2是事务号(transaction ID)
提取待检文件并逐行扫描
利用 svnlook changed -t 获取本次提交的新增/修改文件列表,再对每个非二进制、非忽略类型的文件执行内容检查:
- 用
svnlook cat -t $2 $1 "$file_path"输出文件内容 - 用
grep -n -i -E '密码|token|secret|private_key|localhost:3000'匹配敏感词(支持正则,-i 忽略大小写) - 一旦命中,立即
echo "ERROR: 文件 $file_path 包含敏感词,请移除后重试" >&2并exit 1
区分文件类型避免误判
二进制文件(如图片、编译产物)或已知安全格式(如 .txt、.log)可跳过扫描,防止乱码报错或性能拖慢:
- 通过
svnlook propget -t $2 $1 svn:mime-type "$file_path"判断 MIME 类型,如application/octet-stream直接跳过 - 也可按扩展名过滤,例如
case "$file_path" in *.png|*.jpg|*.pdf) continue ;; esac - 建议保留对源码类后缀(
.java、.py、.js、.xml等)的重点检查
测试与部署注意事项
钩子生效前务必本地验证,避免阻断正常提交:
- 先用
svnlook changed -t [test_txn] [repo]模拟事务,再手动运行钩子脚本调试 - 错误信息必须输出到 stderr(
>&2),否则客户端可能看不到提示 - 脚本中不要依赖用户环境变量(如
$PATH),应使用绝对路径调用grep、svnlook等命令 - 若使用 Windows 服务端,推荐用 PowerShell 或 Python 编写钩子,兼容性更稳











