一、svn安装:

SVN1.32http://subversion.tigris.org/d ... ar.gz
安装:
解压:#: tar zxvf subversion-1.3.2.tar.gz

进入:cd subversion-1.3.2

依次输入./configure , make , make install 进行编译安装完成。

如果这三步报错,可以考虑换 yum -y install subversion方式安装
开启SVN服务:svnserve -d
检测服务是否开启:netstat -ntlp如果看到3690的端口正常开放了,证明SVN启动了。

二:建立SVN版本库:
1、创建版本库目录:#mkdir -p /data/svn
2、创建版本库:#svnadmin create /data/svn/davesvn/
3、编辑权限:
    #vim /data/svn/davesvn/conf/svnserve.conf
    [general]
    anon-access = none
    auth-access = write
    password-db = passwd   #还可以指定到其它目录都是可以的
    authz-db = authz
    realm = davesvn
4、配置允许访问SVN的用户
    #vim /data/svn/davesvn/conf/passwd
    [users]
    leiwen = leiwen@123
5、配置用户访问权限相关
    #vim /data/svn/davesvn/conf/authz
    [groups]
    admin = leiwen 
    # harry_and_sally = harry,sally
    [/]
    @admin = rw

     * = r

    #@admin = r
6、启动svnserve -d -r /data/svn/  
    其中:
    -d表示以daemon方式(后台运行)运行
    -r /data/svn指定根目录是/data/svn,如果提示Can't bind server socket那么就要kill pid 或者重新开个端口svnserve -d --list-port 3689 -r /data/svn

这里需要注意设置防火墙打开3690端口
7、现在有了仓库了就可以往仓库里面提交东西了。我们是以一个项目为单位的进行提交
    #mkdir -p /data/wwwroot/door项目文件目录是在这。项目名称为door

   7.1 #svn import -m 'project' /data/wwwroot/door svn://192.168.0.109/davesvn  这是本地添加到版本库

    7.2#svn import  /data/wwwroot/door  file:///data/svn/davesvn/door -m 'initial import'  这是用Linux命令把网站根目录添加到版本库

    这个时候就会让你输入用户名与密码了
8、从版本库中checkout东西
    #mkdir door&& cd door表示全部的项目都存在这个目录下面
    #svn checkout svn://192.168.1.109/davesvn/door  表示把davesvn中的door里面的项目搞出来,本地。

    #svn checkout file:///data/svn/davesvn/door   /data/wwwroot/door 表示把davesvn中的door里面的项目搞出来。


注:这里的IP也可用域名代替,svn端口默认为3690。

三、设置钩子:
本质是当SVN版本库接到上传或者更新一类的操作时会调用相应的脚本,所以可以直接在相应的脚本中写入要执行的操作进行代码同步。
我们现在来写一个成功svn-commit之后要触发的一个钩子:
#vim /data/svn/davesvn/hooks/post-commit
    #!/bin/sh
    REPOS="$1"
    REV="$2"
    export.UTF-8
    svn up /dotproect --username *** --password ***   ---更新本服务器上的代码,保持和版本库一致
保存即可。

    实现原理:当用户提交commit动作发生都让另外一处project马上从仓库中进行代码checkout一份出来!
    说明:post-commit会接受两个参数
    REPOS="$1"      /data/svn/davesvn表示svn仓库的绝对路径值
    TXN="$2"         表示最新的一个版本号。最后一个版本号
    来看看update的相关参数项
    对它的描述如下:
    Svn update会把版本库的修改带到工作拷贝(工作拷贝的理解其实就是一个工作区)中。如果没有给定修订的版本它就会把当前的工作拷贝更新到HEAD最新版本。否则就是它会把工作拷贝更新到指定的修订版本即—revision后面所带的参数值。为了保持同步svn update也会删除所有在工作拷贝发现的无效锁定。
    正式的代码如下:
    #vim /data/svn/davesvn/hooks/post-commit

    

    #!/bin/bash

    REPOS="$1"

    REV="$2"

    #DIR="/data/wwwroot/door"

    export LC_ALL=en_US.UTF-8

    export.UTF-8

    SVNLOOK=/usr/bin/svnlook

    CURDATE=$(date "+%Y-%m-%d %H:%M:%S")

    AUTHOR=$($SVNLOOK author -r $REV "$REPOS")  #提交作者   

    CHANGEDDIRS=$($SVNLOOK dirs-changed $REPOS) #修改的目录集合 

    MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)  #CHANGEDDIRS里的主目录  

    PROJECT=$(echo $MASTERDIR | awk -F / '{print $1}')  #工程目录

    

    DIR="/data/wwwroot/"$PROJECT

    

    echo "Code Deployed By at $CURDATE,$REPOS,$REV,$AUTHOR,$CHANGEDDIRS,$MASTERDIR,$PROJECT,$DIR" >>/data/svn/davesvn/hooks/deploy_log

    /usr/bin/svn update $DIR --username leiwen --password leiwen@123 --no-auth-cache

    if [$? ==0 ]

    then

            echo "ok" >> /tmp/z.out

    fi

image.png

        测试发现当我修改一个文件然后再commit提交的时候另外一个项目位置是可以。