如何利用svn自动同步更新到网站服务器

咱们最终的目的是:当本地提交后,SVN服务器自动更新服务器端指定WEB目录内的文件python

实现方法:编程

找到服务器端 SVN版本库所在的目录(目录名称是Repositories),这个目录是在安装VisualSVN Server设置的,根据你安装时的设置找到Repositories这个目录,在这个目录下面找到你建立的项目目录,在项目目录下面找到hooks目 录,在此目录中建立一个名为post-commit.bat的批处理文件,内容以下:缓存

@echo off
"D:\VisualSVN Server\bin\svn.exe" update "D:\你的网站目录" --username XXXXX --password XXXXX安全

//将svn.exe的目录设置为你的VisualSVN Server安装目录,设置好你的用户名和密码bash

 

 

同步程序思路:用户提交程序到SVN,SVN触发hooks,按不一样的hooks进行处理,这里用到的是post-commit,利用post- commit到代码检出到SVN服务器的本地硬盘目录,再经过rsync同步到远程的WEB服务器上。服务器

hooks文件详解svn

# start-commit 提交前触发事务
# pre-commit 提交完成前触发事务
# post-commit 提交完成时触发事务
# pre-revprop-change 版本属性修改前触发事务
# post-revprop-change 版本属性修改后触发事务
经过上面这些名称编写的脚本就就能够实现多种功能了,至关强大。
二、同步命令rsync的具体参数使用
三、具备基个语言的编程能力bash python perl均可以实现post

post-commit具体实现细节
post-commit脚本网站


#!/bin/sh
# -------------------------------------------------------------------------------
# Filename:    post-commit
# Description: WEB server with synchronization code by SVN
# -------------------------------------------------------------------------------
#Version 1.0
#当用戶把代碼提交完成时,把代碼中的最新更改同步到 WEB服務器,同時注意不包括刪除操做。日志


#Set variable
SVN=/usr/bin/svn
WEB=/home/test_nokia/
RSYNC=/usr/bin/rsync
LOG=/tmp/rsync_test_nokia.log
WEBIP="192.168.0.23"
export LANG=en_US.UTF-8
 
#update the code from the SVN
$SVN update $WEB --username user --password  password

#若是前面的代码成功完成,会继续执行下面的代码
if [ $? == 0 ]
then
    echo ""     >> $LOG
    echo `date` >> $LOG
    echo "##############################" >> $LOG
    chown -R nobody:nobody /home/test_nokia/
    #同步代码从SVN服务器到WEB服务器 notes:by the key
    $RSYNC -vaztpH  --timeout=90   --exclude-from=/home/svn/exclude.list $WEB root@$WEBIP:/www/ >> $LOG
fi

 

以上是具体的post-commit程序
注意事项:
一、必定要定义变量,主要是用过的命令的路径。由于SVN的考虑的安全问题,没有调用系统变量,若是手动执行是没有问题,但SVN自动执行就会没法执行了。
二、SVN update 以前必定要先手动checkout一份出来,还有这里必定要添加用户和密码 若是只是手动同样会更新,但自动同样的不行。
三、加上了对前一个命令的判断,若是update的时候出了问题,程序没有退出的话还会继续同步代码到WEB服务器上,这样会形成代码有问题
四、记得要设置所属用户,由于rsync能够同步文件属性,并且咱们的WEB服务器通常都不是root用户,用户不正确会形成WEB程序没法正常工做。
五、建议最好记录日志,出错的时候能够很快的排错
六、最后最关键的数据同步,rsync的相关参数必定要清楚,这个就不说了。注意几个场景:
这里的环境是SVN服务器与WEB服务器是开的
把SVN服务器定义为源服务器 WEB服务器为目的服务器
场景1、若是目的WEB服务器为综合的混杂的,像只有一个WEB静态资源,用户提交的,自动生成的都在WEB的一个目录下,建议不要用–delete这个参数
上面这个程序就是这样,实现的是源服务器到目的服务器的更新和添加,而没有删除操做,WEB服务器的内容会多于源SVN的服务器的
场景2、实现镜像,即目的WEB服务器与源SVN服务器同样的数据,SVN上任何变化WEB上同样的变化,就须要–delete参数
场景3、不须要同步某些子目录,可能有些目录是缓存的临时垃圾目录,或者是专用的图片目录(而不是样式或者排版的)要用exclude这个参数
注意:这个参数的使用不用写绝对路径,只要目录名称就行 aa表明文件 aa/ 表明目录 ,缺点就是若是有多个子目录都是同样的名称 那么这些名称就都不会被同步
建议用–exclude-from=/home/svn/exclude.list 用文件的形式能够方便的添加和删除
exclude.list

.svn/
.DS_Store
images/

利用SVN的钩子还能够写出不少的程序来控制SVN 如代码提交前查看是否有写日志,是否有tab,有将换成空格,是否有不容许上传的文件,是否有超过限制大小的文件等等。

相关文章
相关标签/搜索