一、安装svn(subversion)
1.更新源
# yum -y update
2.检查svn软件是否安装
# rpm -aq subversion
3.如果没安装,则执行下面命令安装
# yum -y install subversion
二、配置并启动svn
1.建立svn版本数据存储根目录(svndata)及用户、密码权限目录(svnpasswd)
# mkdir -p /appliction/svndata
# mkdir -p /appliction/svnpasswd
2.启动svn服务指定服务的svn根目录
# svnserve -d -r /appliction/svndata/
# svnserve -d -r /appliction/svndata/ --pid-file=/appliction/svndata/svn.pid
3.查看svn进程
# ps -ef|grep svn
# ps -ef|grep svn|grep -v grep
4.检测svn端口
# lsof -i :3690
# lsof -i tcp:3690
# netstat -lnt|grep 3690
三、建立项目版本库
1.创立一个新的 Subversion 项目 sadoc
# svnadmin create /appliction/svndata/sadoc
# ls -ld /appliction/sadoc
提示:查看svnadmin 命令帮助的方法
# svnadmin help
# svnadmin help create
查看目录树
# tree /appliction/svndata/
2.调整 svn 配置文件及权限文件
# cd /appliction/svndata/sadoc/conf/
# cp svnserve.conf svnserve.conf.bacpup
# cp svnserve.conf svnserve.conf.$(date +%F)
# vi svnserve.conf
修改为下面参数
auth-access = write
password-db = /appliction/svnpasswd/passwd
authz-db = /appliction/svnpasswd/authz
3.对比源文件查看改了哪些东西
# diff svnserve.conf.bacpup svnserve.conf
4.检查
# egrep "\-access|\-db =" svnserve.conf
四、添加svn用户
1.拷贝模板文件
# cp passwd authz /appliction/svnpasswd/
2.查看文件复制过去没有
# ll /appliction/svnpasswd/
3.添加用户(这里添加了3个)
# cd /appliction/svnpasswd/
# vi passwd
注意:前面是账号,后面是密码
[users]
admin1 = admin123
admin2 = admin123
admin3 = admin123
提示:更改svnserve.conf时,需要重启svn,更改 passwd authz不需要重启
4.用户组的配置
# vi authz
5.配置版本库权限 ( sadoc库 )
新建群组用户名为sagroup ,该有2个用户
设置群组权限前面加 @
[groups]
sagroup = admin1 ,admin2
[sadoc:/]
admin3 = rw
@sagroup = r
五、重启svn命令
命令1
# pkill svnserve
# svnserve -d -r /appliction/svndata
命令2
# kill -USER1 `cat /appliction/svndata/svn.pid`
# svnserve -d -r /appliction/svndata/ --pid-file=/appliction/svndata/svn.pid
六、SVN钩子
钩子脚本是被版本库事件触发的程序,例如新修订版本的创建或未版本控制属性的修改。每一种钩子都会被告知事件的足够信息,操作的目标,触发事件的用户名。依赖于钩子的输出或返回状态,钩子程序可以继续执行,停止或以某种方式挂起。
1.钩子说明
钩子 | 说明 |
---|---|
post_commint | 在提交完成成功创建版本之后执行该钩子,提交已经完成,不可更改,因此,本脚本的返回值被忽略。提交完成时触发事务 |
pre_commint | 提交完成前触发执行该脚本 |
start_commint | 在客户端还没向服务器提交数据之前,即还没有建立 Subversion transition之前,执行该脚本(提交前触发事务) |
pre-lock | 对文件进行加锁之前执行该脚本 |
post-lock | 对文件进行加锁之后执行该脚本 |
pre-unlock | 对文件进行解锁操作之前执行该脚本 |
post-unlock | 对文件进行解锁操作之后执行该脚本 |
pre-revprop-change | 在修改 revision 属性之后执行该脚本 |
post-revprop-change | 在修改 revision 属性之前执行该脚本 |
2.钩子应用场景
钩子 | 场景 |
---|---|
pre-commit | 限制上传文件扩展名及大小,控制提交要输入的信息等 |
post-commit | SVN更新自动通知,更新触发chekout程序,然后实时 rsync 推送到服务器等 |
3.钩子生产实例
post-commit 代码同步
#!/bin/sh
REPOS="$1"
REV="$2"
export LC_CTYPE="en_US.UTF-8"
export LC_ALL=
LOGPATH="/app/log"
[ ! -d ${LOGPATH} ] && mkdir ${LOGPATH} -p
#update content from svn
SVN=/usr/bin/svn
$SVN update --username xx --password oo /home/test
if [ $? -eq 0 ]
then
/usr/bin/rsync -az --delete /home/test /tmp/
fi
shell
# export LC_CTYPE="en_US.UTF-8"
# export LC_ALL=
# chmod 700 post-comit
pre-comit 限制上传文件扩展名及大小(扩展和大小不可用)
#!/bin/sh
REPOS="$1"
TXN="$2"
#此处更改大小限制,这里是5M
MAX_SIZE=5242880
#此处增加限制文件后缀名
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 "nLog message cann't be empty!you must input more than 8 chanrs as comment!." 1>&2
exit 1
fi
files=$($SVNLOOK changed -t $TXN $REPOS |cut -d " " -f 4-)
#echo "files">&2
#echo "$r">&2
#exit 1
rc=0
echo "files"|while read f;
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)B" >&2
exit 1
fi
done
#ALL checks passed,so allow the commit
if [ $? -eq 1 ];
then
exit 1
else
exit 0
fi