Linux下SVN安装配置以及客户端使用详解

SVN简介

SVN是一种版本管理系统,前身是CVS,是开源软件的基石。即使在沟通充分的情况下,多人维护同一份源代码的一定也会出现混乱的情况,版本管理系统就是为了解决这些问题。
SVN中的一些概念 :
a. repository(源代码库)
源代码统一存放的地方
b. Checkout (提取)
当你手上没有源代码的时候,你需要从repository checkout一份
c. Commit (提交)
当你已经修改了代码,你就需要Commit到repository
d. Update (更新)
当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更
日常开发过程其实就是这样的(假设你已经Checkout并且已经工作了几天):Update(获得最新的代码) –>作出自己的修改并调试成功 –>Commit(大家就可以看到你的修改了)
如果两个程序员同时修改了同一个文件呢?SVN可以Merge这两个程序员的改动,对,合并,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行呢,SVN会提示文件Confict, 冲突,需要手动确认。

TortoiseSVN简介

TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。这就是为什么许多人将 Subversion 和版本控制系统看作一种“时间机器”。

SVN服务器运行方式

SVN服务器有2种运行方式:独立服务器和借助Apache。2种方式各有利弊。

file:/// 直接版本库访问(本地磁盘)。
http:// 通过配置Subversion的Apache服务器的WebDAV协议。
https:// 与http://相似,但是包括SSL加密。
svn:// 通过svnserve服务自定义的协议。
svn+ssh:// 与svn://相似,但通过SSH封装

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

SVN的配置

检查svn是否安装

下面只是罗列示例命令
通过可执行文件是否存在: svn help/svnadmin help
通过发行包工具检查: rpm -qa | grep subversion
想找常用目录下是否有安装包, 如/usr/local(/lib)下, /usr(/lib)

安装SVN

配置好yum,检查Subversion安装包
[root@svn ~]# yum list |grep subversion
subversion.i386 1.4.2-4.el5_3.1 base
subversion-devel.i386 1.4.2-4.el5_3.1 base
subversion-javahl.i386 1.4.2-4.el5_3.1 base
subversion-perl.i386 1.4.2-4.el5_3.1 base
subversion-ruby.i386 1.4.2-4.el5_3.1 base
[root@svn ~]# yum -y install subversion
测试安装是否成功:
# svnserve --version 回车显示版本说明安装成功
[root@svn ~]# netstat –nat 查看默认TCP 3690端口是否监听,如果看不到,则先启动svn服务后再看,如何启动svn服务,请参考下文的:启动和停止SVN服务。
安装Apache的Linux SVN模块
# yum install mod_dav_svn

创建SVN版本库

[root@svn /]# mkdir -p /data/svndata
[root@svn /]# svnadmin create /data/svndata/winne # winne为版本库名称
[root@svn /]# chown -R apache.apache /data/svndata
注意:修改所有者为apache,是为了能够通过http访问。

Svnserve配置文件概述

svnserve.conf — svn服务配置文件,该文件版本库目录的conf目录下。
passwd — 用户名口令文件,该文件名在文件svnserve.conf中指定,缺省为同目录下的。
authz — 权限配置文件,该文件名也在文件svnserve.conf中指定,缺省为同目录下的。

conf/svnserve.conf 文件

配置项分为以下5项:
anon-access 控制非鉴权用户访问版本库的权限。
auth-access 控制鉴权用户访问版本库的权限。
password-db 指定用户名口令文件名。
authz-db 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。
realm 指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的
认证域相同,建议使用相同的用户名口令数据文件

各参数功能在配置文件的注释中有说明, 此处配置如下:
[general]
anon-access = none # 使非授权用户无法访问
auth-access = write # 使授权用户有写权限
password-db = /data/svndata/winne/conf/passwd # 指明密码文件路径
authz-db = /data/svndata/winne/conf/authz # 访问控制文件
realm = winne # 认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字。
其它采用默认配置. 各语句都必须顶格写, 左侧不能留空格, 否则会出错.
指令简介:这是svn配置文件的格式,请按照以上格式书写。
如果有更多的版本库,依此类推。即除realm = winne外,其他与版本库winne配置文件完全相同。

为了简化配置,多个版本库共用1个用户配置文件。如有必要,也可以分开。
注意:对用户配置文件的修改立即生效,不必重启svn。

配置用户
conf /Passwd 文件

文件格式如下:
[users]
<用户1> = <密码1>
<用户2> = <密码2>
其中,[users]是必须的。下面列出要访问svn的用户,每个用户一行。示例:
[users]
user1 = user1
user2 = user2

可以添加多个,此为用户名密码对。

配置权限
conf /authz 文件
指令简介:此配置文件采用“基于路径的授权”策略,中括号里指定路径,以下列出对各用户的授权。包括只读r,读写rw。没有列出的用户,则不允许访问。还可以对用户分组,具体请参考svn手册
注意:
* 权限配置文件中出现的用户名必须已在用户配置文件中定义。
* 对权限配置文件的修改立即生效,不必重启svn。
用户组格式:
[groups]
<用户组名> = <用户1>,<用户2>
其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。
版本库目录格式:
[<版本库>:/项目/目录]
@<用户组名> = <权限>
<用户名> = <权限>
其中,方框号内部分可以有多种写法:
/ 表示根目录及以下。根目录是svnserve启动时指定的,我们指定为/opt/svndata。这样,/就是表示对全部版本库设置权限。
repos1:/ 表示对版本库1设置权限
repos2:/abc 表示对版本库2中的abc项目设置权限
repos2:/abc/aaa 表示对版本库2中的abc项目的aaa目录设置权限
权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限可以是w、r、wr和空,空表示没有任何权限。
示例1:
[groups]
admin = alan
[/]
@admin = rw
[repos1:/abc/aaa]
king = rw
[repos2:/pass]
king =

示例2:
[groups] 设置组
admin = user1
[/] 根目录权限设置(就是“svndata”这个文件夹)
user1 = rw 用户1权限是:可读写
user2 = r 用户2权限是:可读,不可写
@admin = rw 设置组权限
[svndata:/winne] 设置根目录下“winne”文件夹的权限
user1 = rw
user2 = r

[/data/svndata/test]
user1 = rw
user2 = r
…以此类推

文件自动同步

把每次提交的文件都和/var/www/html同步,那样,就可以直接访问了
复制一份/data/svndata/winne/hooks/post-commit.tmpl并重命名为:post-commit
vi /data/svndata/winne/hooks/post-commit
写入以下内容:

#!/bin/sh
export LANG=en_US.UTF-8
svn update /var/www/html –username user1 –password user1

并且,把这个文件改为777 首先,先在服务器端/var/www/html checkout以后,每次更新就能够向/var/www/html添加了

启动和停止SVN服务

启动Linux SVN访问模式

启动SVN服务:
[root@svn ~]# svnserve -d -r /data/svndata/
svnserve方式,即独立方式,即不需要apache服务器, 可跳过下面的apache安装, 及配置中关于httpd.conf部分,这是小团队项目的推荐方法. 这种方法维护最少, 配置最简单.
指令简介:此指令用于启动svn服务,-d指明以守护模式运行,svn自动在3690端口监听。3690是默认端口,可以使用“–listen-port=”或者“–listen-host=”来指定其它端口。-r选项用来指定svn服务的根目录,这样用户就可以使用相对路径访问,而不用提供完整路径。
注意:这里是/data/svndata/ ,并非/data/svndata/winne。这是SVN使所有仓库根目录都生效的命令,并非某个仓库。这里必须注意。
添加端口运行示例:
启动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 6941 1 0 15:07 ? 00:00:00 svnserve -d –listen-port 3690 -r /opt/svndata
停止SVN服务:
ps -aux |grep svn
kill -9 进程杀掉

svn服务随机启动(非必要)
vi /etc/rc.local
加入如下命令

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
svnserve -d -r /data/svndata/

几点需要注意的问题:
1.服务器已经显示启动了svn,但是客户端访问不了
问题可能是linux的防火墙导致,查看iptables的配置,开放svn的服务器端口。

svn服务与apache整合

Subversion存储方式,一是Berkeley DB伯克利存储方式,二是fsfs存储方式。
两种版本库数据存储对照表

特性
Berkeley DB
FSFS
对操作中断的敏感
很敏感;系统崩溃或者权限问题会导致数据库“塞住”,需要定期进行恢复。
不敏感
可只读加载
不能
可以
存储平台无关
不能
可以
可从网络文件系统访问
不能
可以
版本库大小
稍大
稍小
扩展性:修订版本树数量
无限制
某些本地文件系统在处理单一目录包含上千个条目时会出现问题。
扩展性:文件较多的目录
较慢
较慢
检出最新代码的速度
较快
可以
大量提交的速度
较慢,但时间被分配在整个提交操作中
较快,但最后较长的延时可能会导致客户端操作超时
组访问权处理
对于用户的 umask 设置十分敏感,最好只由一个用户访问。
对 umask 设置不敏感
功能成熟时间
2001 年
2004 年

安装apache

检查apache是否安装。
一般server发行版的linux会附带apache web 服务器。 所以需要先看看是否安装了apache, 及安装的版本号。
通过可执行文件是否存在: 在当前路径下, 输入
# httpd(apachectl) -v
如果存在, 那么输入
# whereis httpd(apachectl)
找出其路径, 再通过
# file命令查其安装路径。如果不存在命令; 那么检查/etc/init.d/httpd是否存在, 如果存在,查看安装路径。通过vi(m)等工具查看其内容,可以找到路径。
通过发行包工具检查, 如在radhat(fedora)系统中, 使用的是rpm或yum, Debian(包括ubuntu)的dpkg或apt-get工具, Suse使用的是YaST(RPM). 如果是以二进制包安装, 则需要使用这些工具检查, 则说明已安装apache.
$ rpm -qa | grep “软件或者包的名字”
$ yum list installed | grep “软件名或者包名”
$ dpkg -l |grep ii | grep packagename
$ apt-cache show package
如果是源代码码安装,且通过第一种方式还找不到, 那么…找找几个常用的地,如/usr/local(/lib)下,/usr(/lib)下,或看看/var/www, /etc/httpd目录等。
找到apache时,那么需要决定使用当前apache,还是升级版本(http://httpd.apache.org/docs/2.2/upgrading.html )。如果不存在,安装之。

下面简单介绍通过包, 源代码, 自动包管理工具安装apache的方式
安装 $ yum -y install httpd 设置自启动(fedora) /sbin/chkconfig httpd on
安装 $ sudo apt-get install apache2
安装 $ yast2 -install apache2
rpm/deb 包, 官网上不提供。 如果有其包, 可通过rpm -i或dpkg -i
源代码:
通过 http://httpd.apache.org/download.cgi , 查看最新版本的连接, 如当前最新版本连接为: http://apache.freelamp.com/httpd/httpd-2.2.15.tar.gz (下面都以这个版本为例)
下载 $ wget(curl) http://apache.freelamp.com/httpd/httpd-2.2.15.tar.gz
解压 $ tar xvzf httpd-2.2.2.tar.gz(或$ gzip -d httpd-2.2.2.tar.gz 回车 $ tar xvf httpd-2.2.2.tar), 进入httpd-2.2.2
$ /configure –enable-dav –enable-so –prefix=/usr/local/apache2/ (配置apache安装,前两个参数是必须要加的,你还可以根据您的需要添加其他的参数。)
编译 make, 安装make install(需要root权限)
测试是否安装成功, $ /usr/local/apache2/apachectl start, 然后输入curl(wget) http://###.###.###.###/ 如出现 “It works!”, 则成功.

设置apache的svn配置文件

vi /etc/httpd/conf.d/subversion.conf

# SVN模块加载
# 找到下列语句,如果没有则自行添加
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule dav_module modules/mod_dav.so  // 如果apache已加载, 要去掉本行。
LoadModule authz_svn_module modules/mod_authz_svn.so # 资源配置(如果多个项目, 共用一套验证, 下面配置就可以, 不然需要每个项目组分开建)

<Location /svn/> # /svn后必须加一个“/”否则浏览器会出现禁止访问
   DAV svn
   SVNListParentPath on # 允许显示父目录列表
   SVNParentPath /data/svndata/ # svn父目录
   AuthzSVNAccessFile /data/svndata/winne/conf/authz # 启用目录级别授权, 权限配置文件

#   # Limit write permission to list of valid users.
#   # 允许匿名访问,不允许Commit,不能与AuthzSVNAccessFile同时使用, 此选项没试过。
#   <LimitExcept GET PROPFIND OPTIONS REPORT>
#      # Require SSL connection for password protection.
#      # SSLRequireSSL
#
		AuthType Basic # 连接类型设置
		AuthName "Subversion  Repository" # 连接框提示
		AuthUserFile /data/svndata/winne/conf/passwd # 用户配置文件
	    Satisfy Any # 表示在同时启用了Allow(允许)和Require的情况下,指定相关策略的,一共有两个备选值,All表示用户必须同时满足Allow和 Require的条件,而Any则是满足其中之一即可。这这里,Satisfy Any用于允许先用匿名方式尝试访问,并根据svnauthz对匿名用户的控制给予访问权限。若没有这句话,则无论svnauthz中是否加入了 "*=r"的写法,匿名用户都是无法访问的。
		Require valid-user # 采用何种认证
#   </LimitExcept>
</Location>

把对应的#号去掉,并修改路径,改为如上的。

密码加密方式增加用户
$ htpasswd -m /data/svndata/winne/conf/passwd user1 //此目录指向httpd.conf中的”用户配置文件” -c 为创建, -m 为修改,“-c”选项表示创建新的/data/svndata/winne/conf/passwd文件,所以usr1所指的用户将是文件中唯一的用户。如果要添加其他用户,则去掉“-c”选项即可.

可能出现的错误:
添加SVN用户出现如下错误
htpasswd: The file /data/svndata/winne/conf/passwd does not appear to be a valid htpasswd file.
增加-c参数
$ htpasswd -c /data/svndata/winne/conf/passwd user1

注意:如果是以SVN独立方式访问,如:svn://192.168.1.66/winne
passwd文件格式如下:
[users]
< 用户1> = < 密码1>
< 用户2> = < 密码2>
其中,[users]是必须的。下面列出要访问svn的用户,每个用户一行。示例:
[users]
alan = password
king = hello

如果是用http方式访问,如:http://192.168.1.66/repos/winne/
passwd文件格式如下:
user1:LAvXp3cFbg7K.
密码必须用htpasswd命令创建
密码文件不能同时对独立方式和http方式都有效,使用不同的访问方式就需要创建不同格式的密码文件

增加用户权限
修改/data/svndata/winne/conf/authz //此目录指向httpd.conf中的”权限配置文件”
$ vi(m) /data/svndata/winne/conf/authz
[test:/] #这表示,仓库test的根目录下的访问权限
admin = rw #test仓库wooin用户具有读和写权限
@developers = rw #@开头的表示组, 组必须存在, 不然死的会很惨。
@test = r
[/] #这个表示在所有仓库的根目录下
* = r #这个表示对所有的用户都具有读权限
[groups] #这个表示群组设置
developers = user1, user2 #这个表示某群组里的成员
test = user2
注意:
* 权限配置文件中出现的用户名必须已在用户配置文件中定义。
* 对权限配置文件的修改立即生效,不必重启svn。
用户组格式:
[groups]
= ,
其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。
版本库目录格式:
[:/项目/目录]
@ =
=
其中,方框号内部分可以有多种写法:
/,表示根目录及以下。根目录是svnserve启动时指定的,我们指定为/data/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 =

如何删除版本库

版本库信息在版本库文件夹里,所以要删除版本库只需要删除版本库所在的文件夹即可。
另外工作副本只是自己维护的文件夹,可以用Windows直接删掉,对别人没有影响。千万不要使用版本库的删除命令,否则版本库里的内容也会被删除。

SVN备份与还原

备份以前的SVN库
#svnadmin dump /opt/svndata/repos > /root/repos20080328
把备份出来的数据恢复到本地
#svnadmin load /opt/svndata/repos/ ; dumpfile
//还原
$svnadmin load newrepo

客户端使用

Windows客户端TortoiseSVN的使用

TortoiseSVN 客户端的安装

l
测试选择的是TortoiseSVN 1.6.5客户端 付中文汉化包.

客户端的文件更新至服务器

(user1操作)
新建一个空目录,右键Checkout (提取)
svn://192.168.103.26/winne
输入passwd文件中的授权用户帐号就可以了
2
在目录中加入一些文件测试. 然后在空白地方右键点TortoiseSVN-> ADD 添加列表到服务器端.此时并没有真正拷贝到服务器上,需再在Commit(提交)操作才会拷贝
3

4

5
在版本库浏览器中就可以看到刚才提交的文件了,此时提交的版本为1.
6

客户端在服务器上拉读取数据

(user2操作)
User2 在机器上新建一个空目录user2 , 右键Checkout (提取)
填入地址: svn://192.168.103.26/winne 输出至G:\user2 确定
增加一个new.txt的文件,然后Commit (提交)之后提示权限出错,user2没有写的权限,换成user1 的身份才可以提交成功.
7

Linux客户端的使用

客户端操作流程一般是:
用户A: checkout (提取) -> add (添加新文件) -> commit (提交)
用户B: SVN log(查看更新) -> update(更新版本)

SVN的安装

yun –y install subversion

Linux svn的常用命令

()内为命令简写.
checkout (co) 提取
commit (ci) 提交
update (up) 更新
list (ls) 列表

checkout (co) 提取 svn服务器上的文件

(user1)操作流程
[root@TEST ~]# svn co svn://192.168.103.26/winne
Authentication realm: My First Repository
Password for ‘root’:
Authentication realm: My First Repository
Username: user1 /输入用户名
Password for ‘user1’: /输入密码
A winne/Cosmic Ride – BeFour.lrc
A winne/20070716171657126.pdf
A winne/svnbook.pdf
revision 1. / checkout (co) 提取成功,看到Checked out版本为1
注:可以使用带用户名和密码的访问:
svn co –username user1 –password user1 svn://192.168.103.26/winne
[root@TEST ~]# ll
drwxr-xr-x 3 root root 4096 Sep 23 09:02 winne /winne目录是SVN自动生成的
drwxr-xr-x 2 root root 4096 Jul 30 02:06 tasks
[root@TEST ~]# cd winne
[root@TEST winne]# ll
total 2868
-rw-r–r– 1 root root 1566968 Sep 23 08:53 20070716171657126.pdf
-rw-r–r– 1 root root 2397 Sep 23 08:53 Cosmic Ride – BeFour.lrc
-rw-r–r– 1 root root 1354300 Sep 23 08:53 svnbook.pdf

user1修改文件并提交

[root@TEST winne]# vi testsvn.txt
[root@TEST winne]# svn add testsvn.txt /将testsvn.txt添加到库中
A testsvn.txt
[root@TEST winne]# svn commit -m “test” testsvn.txt /注释为test
Adding testsvn.txt
Transmitting file data .
Committed revision 2. /版本更新为2了

user2回window客户端更新版本
回到Windows的客户端看日志, 版本已经更新为2了,注释test,客户端update就可以更新到新的版本了.
8

9

Windows客户端的版本回滚

选中菜单中的update to verisiom ,选择版本1即可.
9

10

Linux版本回滚操作

[root@TEST winne]# svn up -r 1

可能出现的问题

1、设置SVNListParentPath后浏览出现Forbidden
解决方法参考:Subversion常见问题及解决方法

日常维护命令和参数

启动svn服务
svnserve -d –listen-port 20000 -r /opt/svndata

创建版本库
svnadmin create fs-type fsfs /opt/svndata/mark

查看版本库的信息
svn list file:///opt/svndata/mark
svn list –verbose file:///opt/svndata/mark

导入库的目录结构
svn import /tmp/mark/ file:///opt/svndata/mark/ –message “init” (文件夹mark下有bo)

删除版本库mark下文件夹bo
svn delete svn://192.168.0.180:20000/opt/svndata/mark/bo -m “delete ”

//导出
$svnlook youngest oldrepo
$svnadmin dump oldrepo > dumpfile

//还原
$svnadmin load newrepo < dumpfile

停止subversion服务
ps –aux | grep svnserve
kill -9 ID号

建立SVN存储仓库示例

#mkdir -p /opt/svndata/repos

#svnadmin create –fs-type fsfs /opt/svndata/repos

备份以前的SVN库
#svnadmin dump /opt/svndata/repos > /root/repos20080328

把备份出来的数据恢复到本地
#svnadmin load /opt/svndata/repos/ < /root/repos20080328

参考资料:

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据