我在这一篇博文http://lidaxia.blog.51cto.com/11588738/1928773中提到,svn钩子脚本是svn非常实用重要的功能,在工作中,会经常需要用到svn钩子脚本以实现除了svn自带功能之外的附加功能,那么这一篇博文,我们就举例演示一下,svn钩子是用来做什么的,以及怎么用。
svn钩子的功能:
svn钩子是一个脚本,它的具体写法和linux操作系统中shell脚本的写法并没有什么不同,通俗来说,svn钩子的功能就是当某种版本库事件(删除文件、上传文件、修改文件名称等等)被触发,以脚本定义的方式继续该事件的执行。
钩子的类型:
常用的钩子脚本
钩子脚本 |
说明 |
post-commit |
在提交完成成功创建版本之后执行该钩子,提交已经完成,不可更改,本脚本的返回值被忽略,提交完成时触发事件 |
pre-commit |
提交完成前触发执行该脚本 |
start-commit |
在客户端还没有向服务器提交数据之前,即还没有建立subversion transaction(缩写为txn)之前,执行该脚本(提交前触发事务) |
非常用的钩子脚本
钩子脚本 |
说明 |
pre-revprop-change |
在修改revision属性之前,执行该脚本 |
post-revprop-change |
在修改revision属性之后,执行该脚本,因为修改稿已经完成,不可更改,因此本脚本的返回值被忽略(不过实际上的实现似乎是该脚本的正确执行与否影响属性修改) |
pre-unlock |
对文件进行解锁操作之前执行脚本 |
post-unlock |
对文件进行解锁操作之后执行脚本 |
pre-lock |
对文件进行加锁操作之前执行脚本 |
post-lock |
对文件进行教唆操作之后执行脚本 |
注意事项:
在使用svn钩子的时候,必须要在钩子脚本中设置好环境变量和命令的绝对路径,因为svn是在一个没有任何环境变量的环境中运行的,甚至都没有$PATH这个变量。
下面通过两个小实验来演示svn钩子的功能,搭建过程可以看我的这篇博文http://lidaxia.blog.51cto.com/11588738/1928773
hooks一般放置在如下目录,有许多的模板
第一个钩子:自动同步项目库文件到另外一台主机
从源码库下载一个项目库
[[email protected] data]# svn co svn://192.168.83.131/dir /data
写一个钩子脚本
[[email protected] hooks]# cat post-commit
#!/bin/bash
REPOS="$1"
REV="$2"
export LC_CTYPE="en_US.UTF-8"
export LC_ALL=
LOGPATH="/var/log"
[ ! -d ${LOGPATH} ] && mkdir ${LOGPATH} -p
SVN=/usr/bin/svn
$SVN update --username lhx --password 1 /data/
if [ $? -eq 0 ]
then
/usr/bin/rsync -az --delete /data/ [email protected]:/tmp/
fi
赋予执行权限
[[email protected] hooks]# chmod +x post-commit
配置免密码认证
[[email protected] hooks]# ssh-keygen
[[email protected] hooks]# ssh-copy-id [email protected]
上传一个测试文件测试
如果脚本有报错会直接在svn软件上显示出来
在client上验证是否已经同步文件
第二个钩子:限制文件大小以及文件的类型,上传需要输入备注
[[email protected] hooks]# vim pre-commit
#!/bin/bash
REPOS="$1"
TXN="$2"
MAX_SIZE=10240000
FILTER=‘\.(zip|rar|o|obj|tar|gz)$‘
SVNLOOK=/usr/bin/svnlook
#LOGMSG=`$SVNLOOK log -t "$TXN""$REPOS" |grep "[a-zA-Z0-9]" | wc -c`
LOGMSG=`$SVNLOOK log -t "$TXN""$REPOS" | wc -c`
if [ "$LOGMSG" -lt 9 ]
then
echo -e"error:can not be empty,you must enter at least 8 characters"1>&2
exit 1
fi
files=$($SVNLOOK changed -t $TXN $REPOS |awk ‘{print$2}‘)
for f in $files
do
#check file type
if echo $f|tr A-Z a-z|grep -Eq $FILTER
then
echo"File $f is not allow ($FILTER) file" >&2
exit 1
fi
#check file size
filesize=$($SVNLOOK cat -t $TXN $REPOS $f|wc -c)
if [ "$filesize" -gt "$MAX_SIZE" ]
then
echo"file $f is too large(must <=$MAX_SIZE)" >&2
exit 1
fi
done
#all checks passed,so allow commit
exit 0
赋予执行权限
[[email protected] hooks]# chmod +x pre-commit
测试
一开始没有输入备注
输入备注之后提示不允许的文件类型
更改文件类型并且输入备注,提示大小超出限制
最近正在找工作,加上又在学习mysql,比较忙,博客更新慢,但是我的博文尽量力求里面的内容大家看到会有收获,而不是简单的把命令历史贴上去。喜欢交流技术的朋友可以私信我,留下qq,微信等联系方式,大家一起交流交流。
如有纰漏,欢迎指正。