要让 SVN 服务端在提交前强制检查日志,需在 hooks/pre-commit 脚本中通过 svnlook log 提取日志,并按非空、长度、正则匹配(如 JIRA ID)、禁用敏感词等规则校验,不满足则 exit 1 拒绝提交。

要让 SVN 服务端在提交前强制检查日志(log message),需在仓库的 hooks/pre-commit 脚本中实现逻辑判断,并在不满足要求时退出非零状态(如 exit 1)来拒绝提交。
确保钩子脚本可执行且路径正确
SVN 钩子是普通 shell 脚本(Linux/macOS)或批处理/PowerShell(Windows),必须:
- 放在仓库根目录下的
hooks/子目录中,文件名严格为pre-commit(无扩展名) - 对运行 SVN 服务的用户(如
svn或www-data)具有可执行权限:chmod +x /path/to/repo/hooks/pre-commit - 第一行指定解释器,例如:
#!/bin/bash或#!/usr/bin/env bash
获取并解析提交日志内容
SVN 会把两个参数传给 pre-commit:仓库路径和事务名(transaction ID)。日志内容需通过 svnlook log 提取:
-
REPOS="$1"TXN="$2" - 用
svnlook log -t "$TXN" "$REPOS"获取原始日志(含换行) - 建议去除首尾空格和换行:
LOGMSG=$(svnlook log -t "$TXN" "$REPOS" | grep -v '^$' | head -n 1 | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
定义并校验日志格式规则
常见强制要求包括:非空、长度下限、匹配正则(如 JIRA 编号)、禁止敏感词。示例规则:
- 日志不能为空:
if [ -z "$LOGMSG" ]; then echo "Log message is required." >&2; exit 1; fi - 至少 5 个字符:
if [ ${#LOGMSG} -lt 5 ]; then echo "Log message must be at least 5 characters." >&2; exit 1; fi - 必须以 JIRA ID 开头(如 PROJ-123):
if ! [[ "$LOGMSG" =~ ^[A-Z]+-[0-9]+[:[:space:]] ]]; then echo "Log must start with JIRA ID (e.g., PROJ-123: ...)." >&2; exit 1; fi - 禁止包含 "TODO"、"FIXME" 等临时标记:
if echo "$LOGMSG" | grep -iqE '(TODO|FIXME|HACK)'; then echo "Log message cannot contain TODO/FIXME/HACK." >&2; exit 1; fi
调试与注意事项
钩子失败时,错误信息会显示在客户端,因此务必用 &2 输出到 stderr;避免使用依赖交互或网络的命令;测试时可用 svn commit --no-auth-cache --non-interactive 模拟;若 SVN 运行在 Apache 下,确保 svnlook 在 Apache 用户的 $PATH 中,或写绝对路径(如 /usr/bin/svnlook)。

















