什么是钩子(hook):
subversion本身有很好的扩展性,用户可以通过钩子(hook)实现一些自定义的功能。
所谓钩子实际上是一种事件机制,当系统执行到某个特殊事件时,会触发我们预定义的动作,这样的特殊事件在subversion里有很多,默认有如下模板可供选择:
shell> ls /path/to/repository/hooks
post-commit.tmpl
post-lock.tmpl
post-revprop-change.tmpl
post-unlock.tmpl
pre-commit.tmpl
pre-lock.tmpl
pre-revprop-change.tmpl
pre-unlock.tmpl
start-commit.tmpl
其中最常用的是pre-commit.tmpl 和 post-commit.tmpl,也就是提交前后的钩子.
注意:默认的是模板文件,正式使用的时候一定要 mv xxxx.tmpl xxxx 为脚本,然后赋予可执行权限,钩子脚本才能正常工作
下面以pre-commit为例来说明一下如何使用SVN钩子。
SVN钩子典型使用场景:
假设有一个PHP项目使用Subversion做版本控制,使用中发现了一些问题,比如程序员不写日志,或者提交的文件有BOM,或者提交的文件有语法错误,或者提交的文件不符合编码规范等等
问题场景:
1. 提交代码时候,不能写空日志或者日志字符数不能少于N个,则拒绝提交
2. 提交代码时候,如果PHP文件语法有错误,则拒绝提交
解决方法:
利用pre-commit钩子来解决
解决工具:
一款老外基于PHP编写的工具php-svn-hook
如果你shell玩的溜,那就在pre-commit脚本里直接编写对应的事件脚本即可,金牛座对PHP熟,所以很多类似场景都是穿透SHELL来调用PHP脚本达到同样的目的,效率很高,所以根据自己的情况选择就是啦,不纠结~
php-svn-hook:
1. 此软件包面向对象开发
2. 先进的插件思想
3. 非常灵活,任意扩展定制所需的插件
4. 完美融合subversion钩子机制
5. 官方有详细说明文档
部署说明:
1. 默认的软件包只提供了日志注释插件
2. 默认的软件包有些BUG,之后我会在其他地方分享出金牛座修订后的代码,到时群里分享地址给大家
3. 软件包目录结构如下:
4. 金牛座扩展了下提交时的检查PHP语法插件,代码如下:
5. 接下来就是编写pre-commit钩子脚本啦,很简单,看图:
vi /path/to/svn_store/project/hooks/pre_commit
6. 效果图演示:
代码分享: