喵星之旅-狂奔的兔子-SVN Hooks 钩子

很多开发者日常只用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
REPOS="$1"
TXN="$2"

# 获取本次提交日志
LOGMSG=$(/usr/bin/svnlook log -t "$TXN" "$REPOS")

# 校验日志长度,少于4字符拒绝提交
if [ ${#LOGMSG} -lt 4 ];then
echo "❌ 提交失败:日志不能为空且至少4个字符,请规范填写提交说明" 1>&2
exit 1
fi

exit 0

授权命令:

1
chmod +x pre-commit

2、post-commit:提交自动更新网站目录
作用:代码提交服务器后,自动拉取最新代码到线上网站目录,实现极简 CI/CD。
文件路径:hooks/post-commit

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh
REPOS="$1"
REV="$2"

# 线上网站目录
WEB_DIR="/data/www/your-project"

# 自动更新代码
svn update -q ${WEB_DIR} --username svn-deploy --password 你的密码

exit 0

3、允许修改历史 SVN 日志
默认 SVN 禁止修改旧日志,复制模板放行即可:
文件路径:hooks/pre-revprop-change

1
2
#!/bin/sh
exit 0

4、项目提交后,服务器自动部署项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/sh

# 接收 SVN 传递的参数
REPOS="$1"
REV="$2"

# 定义你的 Web 目录和日志路径
WEB_PATH="项目路径,单独拉取的"
LOG_FILE="/var/log/hexo_async_deploy.log"

# 【核心】手动将 nvm 管理的 Node 路径加入环境变量 这里是nvm管理的node版本
export PATH=/opt/.nvm/nvm-0.39.1/versions/node/v14.21.3/bin:/usr/bin:$PATH
export LANG=en_US.UTF-8

# 将真正的部署任务放到后台异步执行 (nohup ... &)
nohup bash -c "
# 1. 记录日志
echo '--- 开始异步部署: '$(date)' (版本: '$REV') ---' >> $LOG_FILE

# 2. 拉取最新代码
/usr/bin/svn update $WEB_PATH --no-auth-cache >> $LOG_FILE 2>&1

# 3. 生成 Hexo 静态文件 (此时环境变量已包含 node,hexo 可正常运行)
cd $WEB_PATH && hexo generate >> $LOG_FILE 2>&1

# 4. 完成提示
echo '--- 异步部署完成: '$(date)' ---' >> $LOG_FILE
" > /dev/null 2>&1 &

# 钩子脚本自身必须返回 0,告诉 SVN 提交成功
exit 0

文章目录
  1. 先搞懂:SVN Hooks 到底是什么?
  2. Hooks 目录与启用规则(关键)
  3. 6 个最常用钩子(生产必备)
  4. 生产可用完整脚本(Linux)
|