SVN 钩子脚本(hook script)是由版本事件触发的程序,例如提交新版本。预处理脚本(pre-hooks)在事件之前触发,可以收集事件信息或做一些校验工作(不能修改版本信息),甚至阻止事件发生。后处理脚本(post-hooks)在事件后触发,可以收集事件信息或做一些校验工作(不能修改版本信息)。每种脚本都传递了足够的信息来判断当前发生的操作、被操作对象和操作的用户名等。
钩子脚本的类型
- start-commit,提交开始时触发(Notification of the beginning of a commit)。
- pre-commit,提交完成之前触发(Notification just prior to commit completion)。
- post-commit,提交成功之后触发(Notification of a successful commit)。
- pre-revprop-change,尝试修改版本属性之前触发(Notification of a revision property change attempt)。
- post-revprop-change,成功修改版本属性之后触发(Notification of a successful revision property change)。
- pre-lock,尝试对某个路径加锁之前触发(Notification of a path lock attempt)。
- post-lock,成功对某个路径加锁之后触发(Notification of a successful path lock)。
- pre-unlock,尝试对某个路径解锁之前触发(Notification of a path unlock attempt)。
- post-unlock,成功对某个路径解锁之后触发(Notification of a successful path unlock)。
服务端钩子脚本
位置在 SVN 存储库目录下的 hooks
目录下,必须为可执行程序,例如:在Windows 系统上可以是 pre-commit.exe, pre-commit.bat, pre-commit.cmd
等,Unix 系统上 pre-commit
(添加可执行属性) 等。
注:SVN 存储库目录是使用 svnadmin create
创建的服务端目录,不是 svn checkout
的客户端目录。目录结构如下:
hooks
目录下有很多后缀名为 .tmpl
的模板文件,里面有当前钩子类型的触发的条件、传递的参数和如何使用等详细信息。
将后缀名移除即可启用钩子文件,例如将 pre-commit.tmpl
重命名为 pre-commit.exe
或 pre-commit.bat
(Windows 系统下),pre-commit
(Unix 系统下为添加可执行属性 chmod u+x pre-commit
)。
常用钩子脚本
pre-commit
- 参数:
pre-commit REPOS-PATH TXN-NAME
。 - 描述:在提交业务(commit transaction)变成下个新版本(new revision)之前触发。一般用来阻止不合法的提交,例如:检查提交消息、提交内容和用户权限等。
- 返回值:如果返回值为
0
,则允许提交。返回值不为0
,提交将被中止。中止的信息可以输出到stderr
中传递给客户端。 - 参数1:
REPOS-PATH
,表示 SVN 存储库目录路径。 - 参数2:
TXN-NAME
,这次提交业务(transaction)的名称。这个参数可以传递给svnlook
来获取更多有用的信息,例如:提交用户名,信息,文件路径等。 - 注意:不能在
post-commit
脚本中对版本或提交业务做修改。 - 文档:https://svnbook.red-bean.com/en/1.8/svn.ref.reposhooks.pre-commit.html
- 更多有用的信息可以参考
hooks
目录下的post-commit.tmpl
文件。 - 例子:
1 | !/bin/sh |
post-commit
- 参数:
post-commit REPOS-PATH REVISION TXN-NAME
。 - 描述:在提交业务(commit transaction)成功提交并创建新版本(new revision)后触发。一般用来发出邮件、通知其他工具和备份操作等。
- 返回值:返回值不为
0
并不会影响提交,但是可以输出到stderr
中传递信息给客户端。 - 参数1:
REPOS-PATH
,表示 SVN 存储库目录路径。 - 参数2:
REVISION
,新的版本号。 - 参数2:
TXN-NAME
,这次提交业务(transaction)的名称。 - 注意:不能在
post-commit
脚本中对版本或提交业务做修改。 - 更多有用的信息可以参考
hooks
目录下的post-commit.tmpl
文件。 - 文档:https://svnbook.red-bean.com/en/1.8/svn.ref.reposhooks.post-commit.html
- 例子:
1 | !/bin/sh |
更多例子
参考这篇文章 SVN hooks Tutorials & Guide。
svnlook
常用命令
svnlook log REPOS_PATH -t TXN_NAME
,打印本次提交业务的消息。svnlook changed REPOS_PATH -t TXN_NAME
,打印本次提交业务的文件列表。U
开头表示修改,A
添加,D
删除。svnlook tree REPOS_PATH PATH_IN_REPOS --full-paths
,打印PATH_IN_REPOS
下的目录和文件列表,--full-paths
表示全路径。
TortoiseSVN 客户端脚本
打开 TortoiseSVN -> Settings -> Hook Scripts
点击 Add...
。
选择钩子脚本类型,选择要检查的路径和执行命令即可。
更多参考客户端钩子脚本。