首页 > 代码库 > svn钩子的使用案例

svn钩子的使用案例

svn钩子的使用案例


我在这一篇博文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一般放置在如下目录,有许多的模板

技术分享


第一个钩子:自动同步项目库文件到另外一台主机


从源码库下载一个项目库

[root@svn-server data]# svn co svn://192.168.83.131/dir /data


写一个钩子脚本

[root@svn-server 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/ root@192.168.83.132:/tmp/
fi


赋予执行权限

[root@svn-server hooks]# chmod +x post-commit


配置免密码认证
[root@svn-server hooks]# ssh-keygen
[root@svn-server hooks]# ssh-copy-id
root@192.168.83.132


上传一个测试文件测试

技术分享

如果脚本有报错会直接在svn软件上显示出来

技术分享

在client上验证是否已经同步文件

技术分享


第二个钩子:限制文件大小以及文件的类型,上传需要输入备注

 

[root@svn-server 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


赋予执行权限
[root@svn-server hooks]# chmod +x pre-commit


测试


一开始没有输入备注

技术分享

输入备注之后提示不允许的文件类型

技术分享

更改文件类型并且输入备注,提示大小超出限制

技术分享



最近正在找工作,加上又在学习mysql,比较忙,博客更新慢,但是我的博文尽量力求里面的内容大家看到会有收获,而不是简单的把命令历史贴上去。喜欢交流技术的朋友可以私信我,留下qq,微信等联系方式,大家一起交流交流。

如有纰漏,欢迎指正。

 









本文出自 “开源精神,源于分享” 博客,请务必保留此出处http://lidaxia.blog.51cto.com/11588738/1934656

svn钩子的使用案例