很多开发者日常只用 SVN 拉代码、提代码,但从未真正用过 SVN Hooks(钩子)。
但 Hooks 是 SVN 最实用的自动化能力:可以实现 强制写提交日志、禁止提交垃圾文件、提交自动部署、提交消息推送、禁止违规代码提交 等功能。
本文从零讲透:什么是钩子、运行机制、常用钩子类型、Windows/Linux 完整可运行脚本、生产避坑细节,看完直接落地可用。
先搞懂:SVN Hooks 到底是什么?
SVN Hooks 是服务端触发的自动化脚本,和本地客户端无关。
核心特性:
1. 运行位置:SVN 服务端仓库,不是你的电脑
1. 触发逻辑:提交、改日志、加锁等动作前后自动执行
1. 阻断能力:pre 前置钩子可拦截操作,post 后置钩子仅执行任务、无法回滚
通俗理解:
1. pre-xxx:做事之前检查,不合格直接不让操作(拦截提交)
1. post-xxx:事情做完后收尾,自动部署、发通知
Hooks 目录与启用规则(关键)
每个 SVN 仓库下都有固定的 hooks 目录:
你的仓库目录/hooks/
目录内自带大量 .tmpl 模板文件,模板默认不生效。
启用硬性规则:
1. 去掉 .tmpl 后缀
1. 文件名必须和官方钩子名完全一致,不能乱改
1. Linux 需要添加可执行权限,Windows 对应 bat 后缀
6 个最常用钩子(生产必备)
start-commit 提交事务刚创建 黑名单用户拦截、权限校验 可拦截
pre-commit 文件上传完成,写入仓库前 日志校验、文件过滤、代码检查(最常用) 可拦截
post-commit 提交成功、版本号生成后 自动部署、消息推送、日志通知 不可回滚
pre-revprop-change 修改历史日志前 允许/禁止修改旧提交日志 可拦截
post-revprop-change 日志修改完成后 日志变更通知 不可回滚
pre-lock / post-lock 文件加锁前后 文件锁定权限管控 可拦截
核心工具:svnlook
钩子脚本中必须用 svnlook 查看未完成的提交事务,无法用普通 svn 命令替代。
生产可用完整脚本(Linux)
1、pre-commit:强制提交日志非空(必装)
作用:禁止空日志、简短垃圾日志提交,规范团队迭代记录。
文件路径:hooks/pre-commit
1 | #!/bin/sh |
授权命令:
1 | chmod +x pre-commit |
2、post-commit:提交自动更新网站目录
作用:代码提交服务器后,自动拉取最新代码到线上网站目录,实现极简 CI/CD。
文件路径:hooks/post-commit
1 | #!/bin/sh |
3、允许修改历史 SVN 日志
默认 SVN 禁止修改旧日志,复制模板放行即可:
文件路径:hooks/pre-revprop-change
1 | #!/bin/sh |
4、项目提交后,服务器自动部署项目
1 | #!/bin/sh |