svn钩子的使用案例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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一般放置在如下目录,有许多的模板

技术分享


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


从源码库下载一个项目库

[[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,微信等联系方式,大家一起交流交流。

如有纰漏,欢迎指正。

 









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

以上是关于svn钩子的使用案例的主要内容,如果未能解决你的问题,请参考以下文章

git-svn 的钩子

如何使用钩子设置和操作自定义 svn 修订属性

centos 6.8 设置svn钩子同步至web目录

SVN使用钩子函数(post-commit)自动推送到业务服务器

SVN迁移至Linux服务器实录&钩子Dump实现自动备份

钉钉自定义机器人配合SVN钩子事件进行消息的推送实践