SVN安装、配置、使用笔记

SVN安装
svn存储版本数据也有2种方式:
BDB和FSFS。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。
1. 获取svn安装包:

http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz
http://subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz。
编译svn以root用户登录。
将subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz传到服务器。
tar xfvz subversion-1.4.0.tar.gz
tar xfvz subversion-deps-1.4.0.tar.gz
cd subversion-1.4.0
./configure –prefix=/opt/svn –without-berkeley-dbwith-zlib
(注:以svnserve方式运行,不加apache编译参数。以fsfs格式存储版本库,不编译berkeley-db)
make clean
make
make install
vi /etc/profile,在/etc/profile最后加入:
PATH=$PATH:/opt/svn/bin
export PATH
svn测试svnserve –version
如果显示如下,svn安装成功:
svnserve, version 1.4.0 (r21228)
compiled Oct 12 2006, 10:18:56Copyright (C) 2000-2006 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
The following repository back-end (FS) modules are available:
* fs_fs : Module for working with a plain file (FSFS) repository.

安装最新版
下载subversion-1.8.9.tar.gz解压
安装前先安装cpr和apr-util
然后下载sqlite解压到subversion下面的sqlite-amalgamation
https://archive.apache.org/dist/apr/
./configure --prefix=/usr/local/webserver/apr
./configure --prefix=/usr/local/webserver/apr-util --with-apr=/usr/local/webserver/apr/

把sqlite下载解压拷贝到安装目录http://www.sqlite.org/download.html

./configure --prefix=/data/svn/ --with-apr=/usr/local/webserver/apr/bin/apr-1-config --with-apr-util=/usr/local/webserver/apr-util/bin/apr-1-config
make && make install

2.svn配置

建立svn版本库目录可建多个:
mkdir -p /opt/svndata/repos1
mkdir -p /opt/svndata/repos2

建立svn版本库svnadmin create /opt/svndata/repos1
svnadmin create /opt/svndata/repos2

修改svn版本库配置文件版本库1:
    vi /opt/svndata/repos1/conf/svnserve.conf
    内容修改为:
    [general]
    anon-access = none
    auth-access = write
    password-db = /opt/svn/conf/pwd.conf
    authz-db = /opt/svn/conf/authz.conf
    realm = repos1
版本库2:
    vi /opt/svndata/repos2/conf/svnserve.conf
    内容修改为:
    [general]
    anon-access = none
    auth-access = write
    password-db = /opt/svn/conf/pwd.conf
    authz-db = /opt/svn/conf/authz.conf
    realm = repos2
即除realm = repos2外,其他与版本库1配置文件完全相同。如果有更多的版本库,依此类推。
配置允许访问的svn用户vi /opt/svn/conf/pwd.conf
为了简化配置,2个版本库共用1个用户配置文件。如有必要,也可以分开。
注意:对用户配置文件的修改立即生效,不必重启svn。
文件格式如下:
    [users]
    <用户1> = <密码1>
    <用户2> = <密码2>
其中,[users]是必须的。下面列出要访问svn的用户,每个用户一行。示例:
    [users]
    alan = password
    king = hello
配置svn用户访问权限vi /opt/svn/conf/authz.conf
为了简化配置,3个版本库共用1个权限配置文件/opt/svn/conf/pwd.conf。如有必要,也可以分开。文件中定义用户组和版本库目录权限。
注意:
    * 权限配置文件中出现的用户名必须已在用户配置文件中定义。
    * 对权限配置文件的修改立即生效,不必重启svn。
用户组格式:
    [groups]
    <用户组名> = <用户1>,<用户2>
    其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。
版本库目录格式:
    [<版本库>:/项目/目录]
    @<用户组名> = <权限>
    <用户名> = <权限>
其中,方框号内部分可以有多种写法:
/,表示根目录及以下。根目录是svnserve启动时指定的,我们指定为/opt/svndata。这样,/就是表示对全部版本库设置权限。
    repos1:/,表示对版本库1设置权限
    repos2:/abc, ,表示对版本库2中的abc项目设置权限
    repos2:/abc/aaa, ,表示对版本库2中的abc项目的aaa目录设置权限
权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限可以是w、r、wr和空,空表示没有任何权限。
示例:
    [groups]
    admin = alan
    [/]
    @admin = rw
    [repos1:/abc/aaa]
    king = rw
    [repos2:/pass]
    king =
    svn配置完毕,删除无用文件rm /opt/svndata/repos1/conf/authz
    rm /opt/svndata/repos1/conf/passwd
    rm /opt/svndata/repos2/conf/authz
    rm /opt/svndata/repos2/conf/passwd

3.启动svn

建立启动svn的用户
    useradd svn
    passwd svn
根据提示为用户svn设置密码
允许用户svn访问版本库
    chown -R svn:svn /opt/svndata
    chown -R svn:svn /opt/data
启动svn
    su - svn -c "svnserve -d --listen-port 9999 -r /opt/svndata"
其中:
    su - svn表示以用户svn的身份启动svn
    -d表示以daemon方式(后台运行)运行
    –listen-port 9999表示使用9999端口,可以换成你需要的端口。但注意,使用1024以下的端口需要root权限
    -r /opt/svndata指定根目录是/opt/svndata
检查:
    ps -ef|grep svnserve
如果显示如下,即为启动成功:
    svn 69411 0 15:07 ? 00:00:00 svnserve -d –listen-port 9999 -r /opt/svndata
通过web方式访问svn有很多方法,请参阅配置websvn或配置bsSvnBrowser的方法。
相关参考:
http://www.ibm.com/developerworks/cn/opensource/os-subversion/

启动SVN服务
    svnserve -d -r /home/svn
描述说明:
    -d 表示svnserver以“守护”进程模式运行
    -r 指定文件系统的根位置(版本库的根目录),这样客户端不用输入全路径,就可以访问版本库
如: svn://192.168.12.118/fitness
这时SVN安装就完成了.
局域网访问方式:
例如:svn checkout svn://192.168.12.118/fitness --username mirze --password 123456 /var/www/fitness
linuxcheckout服务器里面ckeckout
svn checkout svn://192.168.1.1/pro/domain
简写svn co svn://192.168.1.1/pro/domain
自动post-cmmin
编辑hooks下面的post-commit
    #!/bin/sh
    export LANG=zh_CN.UTF-8
    REPOS="$1"
    REV="$2"
    /data/svn/bin/svn update /data/html/test.yf/ --username yf --password redhat

参数说明:
1、 将文件checkout到本地目录

svn checkout   path(path是服务器上的目录)
   例如:svn checkout svn: // 192.168.1.1 / pro / domain
    简写:svn co
将test.e的svn检出到不同名字的项目
/data/svn/bin/svn co svn://192.168.1.1/test.e /data/html/test
将原有的项目建立一个不同名字的svn
bm_antuan365_com 项目在正常运行
建立antuan的svn 
/data/svn/bin/svn add  /data/html/test/*
/data/svn/bin/svn commit -m "第一次提交" /data/html/test/*

找到svn版本信息删除
find . -type d -name ".svn"|xargs rm -rf

2、 往版本库中添加新的文件

  svn  add   file 
   例如:svn  add   test.php(添加test.php)
   svn  add   * .php(添加当前目录下所有的php文件)

3、 将改动的文件提交到版本库

  svn commit   -m  " LogMessage "   [ -N ]   [ --no-unlock ]   PATH (如果选择了保持锁,就使用--no-unlock开关)
   例如:svn commit -m  " add test file for my test "   test.php
    简写:svn ci

4、 加锁/解锁

  svn lock   -m  " LockMessage "   [ --force ]   PATH 
   例如:svn lock -m  " lock test file "   test.php
svn unlock   PATH

5、 更新到某个版本

  svn update -r  m path
   例如:
      svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
     svn update -r  200   test.php(将版本库中的文件test.php还原到版本200)
     svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件 ,然后清除svn resolved ,最后再提交commit)
   简写:svn up

6、 查看文件或者目录状态

   1 )svn status   path (目录下的文件和子目录的状态,正常状态不显示)
   【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
   2 )svn status -v   path (显示文件和子目录状态)
   第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
   注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st

7、 删除文件

  svn delete   path -m  " delete test fle " 
   例如:svn delete svn:// 192.168.1.1 /pro/domain/test.php -m  " delete test file "
    或者直接svn delete test.php 然后再svn ci -m 'delete test file‘,推荐使用这种
简写:svn (del, remove, rm)

8、 查看日志

  svn log   path
   例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化

9、 查看文件详细信息

  svn info   path
   例如:svn info test.php

10、 比较差异

  svn diff   path(将修改的文件与基础版本比较)
   例如:svn diff test.php
svn diff   -r m:n path(对版本m和版本n比较差异)
   例如:svn diff -r 200:201 test.php
   简写:svn di

11、 将两个版本之间的差异合并到当前文件

  svn merge -r   m:n path
   例如:svn merge -r  200 : 205   test.php(将版本200205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)

12、 SVN 帮助

svn help
svn help ci
以上是常用命令,下面写几个不经常用的

13、 版本库下的文件和目录列表

  svn list  path
   显示path目录下的所有属于版本库的文件和目录
简写:svn ls

14、 创建纳入版本控制下的新目录

svn mkdir : 创建纳入版本控制下的新目录。
用法: 1mkdir PATH...
         2mkdir URL...
创建版本控制的目录。
    1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增
         调度,以待下一次的提交。
    2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
    在这两个情况下,所有的中间目录都必须事先存在。

15、 恢复本地修改

svn revert : 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH...
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复
        被删除的目录

16、 代码库URL变更

svn switch (sw):   更新工作副本至不同的URL。
用法: 1switch URL [PATH]
     2switch --relocate FROM TO [PATH...]

    1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将
         服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的
         方法。
    2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动  
        (比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用
        这个命令更新工作副本与仓库的对应关系。

17、 解决冲突

svn resolved:   移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH...
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
        相关文件,然后让 PATH 可以再次提交。

自动添加svn

#!/bin/sh

if [ $# -lt 1 ]; then
    echo "error.. need directory"
    exit 1
fi

mkdir /html/$1
chown -Rf www:www /html/$1
mkdir /svn/www/$1
/svn/bin/svnadmin create /svn/www/$1
echo "[general]" > /svn/www/$1/conf/svnserve.conf
echo "anon-access = none" >> /svn/www/$1/conf/svnserve.conf
echo "auth-access = write" >> /svn/www/$1/conf/svnserve.conf
echo "password-db = /svn/passwd" >> /svn/www/$1/conf/svnserve.conf
echo "authz-db = /svn/authz" >> /svn/www/$1/conf/svnserve.conf
echo "realm = $1" >> /svn/www/$1/conf/svnserve.conf

echo " " >> /svn/authz
echo "[$1:/]" >> /svn/authz
echo "@admin=rw" >> /svn/authz
echo "@wk=rw" >> /svn/authz
echo "*=" >> /svn/authz


echo "#!/bin/sh" > /svn/www/$1/hooks/post-commit
echo "export LANG=zh_CN.UTF-8" >> /svn/www/$1/hooks/post-commit
echo " REPOS=\"\$1\"" >> /svn/www/$1/hooks/post-commit
echo " REV=\"\$2\"" >> /svn/www/$1/hooks/post-commit
echo " /svn/bin/svn update /html/"$1"/ --username yufei --password yufei &&" >> /svn/www/$1/hooks/post-commit
chmod +x /svn/www/$1/hooks/post-commit

killall svnserve
/svn/bin/svnserve -d -r /svn/www

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

知识点:
1、SVN的hooks

# start-commit 提交前触发事务
# pre-commit 提交完成前触发事务
# post-commit 提交完成时触发事务
# pre-revprop-change 版本属性修改前触发事务
# post-revprop-change 版本属性修改后触发事务

通过上面这些名称编写的脚本就就可以实现多种功能了,相当强大。
2、同步命令rsync的具体参数使用
3、具有基个语言的编程能力bash python perl都可以实现

post-commit具体实现细节
post-commit脚本
编辑文件:vim /home/svn/fitness/hooks/post-commit
注意:编辑完成post-commit后,执行:sudo chmod 755 post-commit
内容:
!/bin/sh
export LANG=zh_CN.UTF-8
 /usr/bin/svn update /var/www/www --username mirze --password 123456
或
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 the previous command completed successfully, to continue the following
if [ $? == 0 ]
then
    echo ""     >> LOG
    echo `date` >> LOG
    echo "##############################" >> LOG
    chown -R nobody:nobody /home/test_nokia/
    Synchronization code from the SVN server to the WEB server, notes:by the key
    RSYNC -vaztpH  --timeout=90   --exclude-from=/home/svn/exclude.list WEB root@$WEBIP:/www/ >> LOG
fi

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

.svn/
.DS_Store
images/

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值