SVN 拒绝无任务单提交需配置 pre-commit 钩子脚本,检查 svnlook log 提取的日志是否匹配如 JRA-123 的正则格式,不满足则 exit 1 并输出明确错误提示,确保脚本可执行、权限正确且经充分测试。

要让 SVN 拒绝没有关联任务单(如 Jira ID、Bug 编号等)的提交,核心是利用 pre-commit 钩子脚本——它在每次提交写入版本库前执行,可检查提交日志(log message),若不满足格式要求(例如缺少任务单编号),就中止提交并返回错误。
确保钩子脚本可执行且路径正确
SVN 仓库的 hooks/ 目录下需存在名为 pre-commit 的可执行脚本(Linux/macOS 下需 chmod +x;Windows 下可用 .bat 或 PowerShell 脚本)。脚本接收两个参数:$1 是仓库路径,$2 是事务名(transaction ID),用于获取本次提交的元数据。
- 不要用
post-commit—— 它发生在提交之后,无法拒绝提交 - 脚本必须以非零退出码(如
exit 1)表示拒绝,零表示允许 - 确保运行用户(通常是 svn 进程用户,如
www-data或svn)有权限读取事务日志
提取并验证提交日志中的任务单编号
使用 svnlook log -t "$2" "$1" 获取本次提交的日志内容,再用正则匹配常见任务单格式(如 JRA-123、BUG-456、TASK-789)。建议至少匹配字母+数字组合,避免仅靠单词“Jira”或“task”这种弱标识。
- 推荐正则示例:
^[A-Z]{2,}-[0-9]+(匹配大写字母开头、连字符、数字,如PROJ-123) - 支持多任务单:允许日志中出现多个匹配项(如
JRA-101, JRA-102: fix login) - 区分大小写:通常任务单编号全大写,正则保持大写敏感更稳妥
提供清晰的拒绝提示和修复指引
当匹配失败时,脚本应输出明确错误信息到标准错误(stderr),SVN 会将其显示给提交者。避免只说“提交被拒绝”,而要说明规则和正确格式。
- 示例提示:
ERROR: Commit log must contain at least one valid ticket ID (e.g., JRA-123 or BUG-456). - 可追加帮助信息:
Hint: Add it in the first line of your commit message. - 避免输出调试信息(如路径、变量值)到 stdout/stderr,以免干扰客户端
测试与上线前务必本地验证
直接在服务器上修改钩子前,先用 svnlook log -t xxx /path/to/repo 手动模拟事务日志,再运行钩子脚本测试逻辑。也可临时在测试仓库启用钩子,用真实客户端尝试合规/不合规提交。
- 测试用例应覆盖:空日志、纯中文日志、含 URL 但无编号、编号位置在末尾、编号含空格或标点等边界情况
- 注意 Windows 换行符(CRLF)可能影响正则匹配,建议统一用
tr '\r' '\n'或用语言内置处理 - 上线后观察日志(如重定向脚本输出到文件),便于排查误拒或漏放

















