首页 > 代码库 > svn hooks的使用demo

svn hooks的使用demo

svn提供了Hooks Script。所谓钩子实际上市一种时间触发机制,是指当系统执行到某个特殊的事件时,触发我们预定义的动作,可以让我们在某些特定状态发生的时候做我们想做的事。

进入一个生成的SubVersion的代码仓库,在目录下面有一个Hooks的目录,进入该目录,正常情况下,你应该看到的是下图:

.tmpl都是每个hooks的模板文件,其实都是文本文件,使用vi打开后,可以看到里面的注释和详细的说明,这些是我们可以使用的第一手的帮助文件。

如上图svn服务端有9种钩子,分别是:

A.关于锁定的2种
a1.pre-lock
a2.post-lock
B.关于解锁的2种
b1.pre-unlock
b2.post-unlock
C.关于提交的3种
c1.start-commit
c2.pre-commit
c3.post-commit

顺序是:c1---->c2----->c3

D.关于属性的2种
d1.pre-revprop-change
d2.post-revprop-change

比如这里我们想强制svn的提交者必须输入对应的log,我们就需要pre-commit这个hooks。

pre-commit:当Svn收到了用户提交上来的文件,在最终存入Repository前,会调用Pre-commit,同时传两个参数进去,一个就是提交的Repository的路径(服务器端的实际路径),第二个就是TXN-Name. Transaction Name,这个是用于标识此提交进程的事务ID.

接下里重命名pre-commit.tmpl为pre-commit,并同时给该文件可执行权限(很重要,我就是这里忘记了,排错了好久,不然脚本执行后会显示不知所云的错误信息:svn: Commit blocked by pre-commit hook (exit code 255) with no output。)

修改pre-commit文件内容如下:

#!/bin/shREPOS="$1"TXN="$2"SVNLOOK=/usr/bin/svnlook  LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`if [ "$LOGMSG" -lt 5(要求的log长度,依实际需要修改) ];thenecho -e "nEmpty log message not allowed. Commit aborted!" 1>&2exit 1fi# All checks passed, so allow the commit.exit 0

不用重启svn,再提交代码时,就必须按要求写注释了。

Tips:

1,配置完成之后一定要给对应的*-commit加上可执行权限,否则会出现如图所示错误。

,

2,使用post-commit的时候要慎重,因为整个操作不能保证原子性。