svn post-commit钩子可自动发送提交邮件,需配置可执行权限、确保mail/sendmail/python环境可用,用svnlook提取作者、版本、日志等信息,通过mail命令、sendmail或python smtplib发送,并记录日志、添加错误处理。

SVN服务端的 post-commit 钩子可以在每次提交成功后自动触发脚本,常用于通知、构建或同步操作。要实现“自动发送邮件”,核心是让钩子脚本调用系统邮件工具(如 mail、sendmail 或 Python 的 smtplib),并提取本次提交的关键信息(作者、版本号、修改文件、日志等)作为邮件内容。
确认钩子脚本权限与执行环境
SVN 钩子运行在服务端进程(如 svnserve 或 Apache)的上下文中,通常以运行 SVN 服务的用户身份执行(如 svn、www-data 或 root)。务必确保:
- 钩子脚本(如
hooks/post-commit)具有可执行权限:chmod +x post-commit - 脚本中使用的命令(如
mail、python3)在该用户 PATH 下可用,或使用绝对路径(如/usr/bin/mail) - 若用 Python 发送邮件,对应 Python 环境需安装必要模块(如
smtplib、email),且网络可访问 SMTP 服务器
获取提交信息并构造邮件内容
SVN 会将两个参数传给 post-commit:仓库路径和新提交的修订版本号($1 $2)。用 svnlook 提取详情:
-
svnlook author -r $2 $1→ 提交者 -
svnlook date -r $2 $1→ 提交时间 -
svnlook log -r $2 $1→ 提交日志 -
svnlook changed -r $2 $1→ 修改的文件列表 -
svnlook info -r $2 $1→ 汇总信息(含作者、日期、日志)
建议将这些输出格式化为清晰的纯文本邮件正文,避免特殊字符乱码,必要时用 iconv 或 sed 过滤控制符。
选择并配置邮件发送方式
推荐三种轻量可靠的方式:
-
使用系统 mail 命令(最简单):
echo "$body" | mail -s "SVN r$2 提交通知" -r "svn@yourdomain.com" dev-team@example.com
确保mailutils或heirloom-mailx已安装,并配置好本地 MTA(如 postfix) -
调用 sendmail 直接投递(绕过 mail 命令):
构造标准邮件头(To:、From:、Subject:、Date:),通过/usr/sbin/sendmail -t输入 -
用 Python 脚本调用 SMTP(适合需认证/加密场景):
写一个独立 Python 脚本(如/path/to/send_svn_mail.py),接收$1 $2作为参数,用smtplib.SMTP_SSL连接企业邮箱(如腾讯企业邮、阿里云邮箱),支持用户名密码或 OAuth2 认证
调试与错误处理要点
钩子失败不会影响提交本身,但错误会被丢弃(除非重定向到日志)。务必:
- 在脚本开头添加
exec >> /var/log/svn-post-commit.log 2>&1记录执行过程 - 对每个
svnlook和邮件命令加|| exit 1,并在失败时echo "ERROR: ..." >&2 - 测试时先用
svnlook info -r $2 $1手动验证参数是否正确,再逐步加入邮件逻辑 - 避免邮件内容过长导致截断——对
svnlook changed输出做行数限制(如head -n 20)
不复杂但容易忽略











