SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。svn服务器有2种运行方式:独立服务器和借助apache运行。两种方式各有利弊,用户可以自行选择。

svnserve是SVN自带的一个轻型服务器,客户端通过使用以svn://或svn+ssh://为前缀的URL来访问svnserve服务器,实现远程访问SVN版本库。svnserve可以通过配置文件来设置用户和口令,以及按路径控制版本库访问权限。本文详细分析了svnserve配置文件格式,并说明如何使用配置文件控制版本库访问权限
svn的版本管理其最大的特点就是集中式,所有的项目代码文件都放在svn服务器上,客户端并不具有全部项目代码文件,因此对svn服务器的设备要求较高

1、服务端安装配置

[root@svn-server ~]# yum install -y subversion
[root@svn-server ~]# mkdir -p /application/svndata			#创建svn的版本库的根目录
[root@svn-server ~]# mkdir -p /application/svnpasswd		#创建svn的密码权限目录
[root@svn-server ~]# svnserve -d -r /application/svndata		#启动,指定svn的根目录(-d: 后台运行,-r:路径)
[root@svn-server ~]# netstat -lntup|grep 3690
tcp        0      0 0.0.0.0:3690            0.0.0.0:*               LISTEN      2231/svnserve

建立版本库(也可以理解为是一个项目,这个目录不能用mkdir来创建,因为svn有自己运行方式,会创立属于svn自己很多的文件)

[root@svn-server ~]# svnadmin create /application/svndata/sadoc

修改配置文件

[root@svn-server ~]# cd /application/svndata/sadoc/conf/
[root@svn-server conf]# cp svnserve.conf svnserve.conf.bak
[root@svn-server conf]# vim svnserve.conf
[general]
anon-access=none   	#控制非鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。
                	 	即"write"为可读可写,"read"为只读,"none"表示无访问权限。
                 		缺省值:read
auth-access=write   	#控制鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。
                 		即"write"为可读可写,"read"为只读,"none"表示无访问权限。
                 		缺省值:write
password-db = passwd  	#指定用户名口令文件名。除非指定绝对路径,否则文件位置为相对conf
                 			目录的相对路径。
                 			缺省值:passwd
authz-db = authz   		#指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。
                 			除非指定绝对路径,否则文件位置为相对conf目录的相对路径。
                 			缺省值:authz
realm= My First Repository		#指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的
                 				认证域相同,建议使用相同的用户名口令数据文件。
                				缺省值:一个UUID(Universal Unique IDentifier,全局唯一标示)
[root@svn-server conf]# pwd
/application/svndata/sadoc/conf	
[root@svn-server conf]# chmod 700 *		#修改权限(原来的权限为644,任何人都可以看到, svn的密码是明文的)
[root@svn-server conf]# vim passwd		#末行添加以下用户
[users]
test1 = 1111
test2 = 2222
test3 = 3333

用户名口令文件由svnserve.conf的配置项password-db指定,缺省为conf目录中的passwd。该文件仅由一个[users]配置段组成。
[users]配置段的配置行格式如下:
<用户名> = <口令>
注意:配置行中的口令为未经过任何处理的明文

[root@svn-server conf]# vim authz
dev = test1,test2	#定义组名和组成员(在passwd里定义的)
ops = test3		#定义组名和组成员
[sadoc:/]		#定义项目额权限:  项目名称sadoc,表示该项目下所有内容允许谁可以有什么权限
@dev = rw		#允许某个组dev来访问,则前面要加@这个符号来标识下
@ops = r			#允许ops组来查看
test3 = r		#允许用户test3来查看

权限配置文件由svnserve.conf的配置项authz-db指定,缺省为conf目录中的authz。该配置文件由一个[groups]配置段和若干个版本库路径权限段组成。
[groups]配置段中配置行格式如下:
<用户组> = <用户列表>
用户列表由若干个用户组或用户名构成,用户组或用户名之间用逗号","分隔,引用用户组时要使用前缀"@"(如:引用用户组"all"要使用字符串"@all")。
版本库路径权限段的段名格式如下:
[<版本库名>:<路径>]
如版本库abc路径/tmp的版本库路径权限段的段名为"[abc:/tmp]"。
可省略段名中的版本库名。若省略版本库名,则该版本库路径权限段对所有版本库中相同路径的访问控制都有效。如:段名为"[/tmp]"的版本库路径权限段设置了所有引用该权限配置文件的版本库中目录"/tmp"的访问权限。
版本库路径权限段中配置行格式有如下三种:
<用户名> = <权限>
<用户组> = <权限>
* = <权限>
其中,"*"表示任何用户;权限的取值范围为''、'r'和'rw',''表示对该版本库路径无任何权限,'r'表示具有只读权限,'rw'表示有读写权限。
注意:每行配置只能配置单个用户或用户组。
配置文件保存后就立即生效,重启或者不重启svnserve服务都可以

[root@svn-server conf]# pkill svnserve
[root@svn-server conf]# svnserve -d -r /application/svndata		#重新启动svn
[root@svn-server conf]# netstat -lntup|grep 3690
tcp        0      0 0.0.0.0:3690            0.0.0.0:*               LISTEN      2309/svnserve

启动到svndata这个目录,所以在客户端访问的URL中末尾续接上/sadoc,假如只有1个项目时,就可以 svnserve .../application/svndata/sadoc,直接输入地址svn://xxx.xxx.xxx.xxx即可访问

[root@svn-server conf]# vim /etc/rc.d/rc.local		#将svn加入到开机启动
/usr/bin/svnserve	-d -r /application/svndata

SVN配置详细信息参考

2、客户端配置和使用

2.1、Linux客户端使用svn

[root@svn-client ~]# yum install -y subversion
基本操作:
[root@svn-client ~]# svn checkout svn://10.0.0.10/sadoc	#导出
认证领域: <svn://10.0.0.10:3690> My First Repository
“root”的密码: 
认证领域: <svn://10.0.0.10:3690> My First Repository
用户名: test1
“test1”的密码: 

-----------------------------------------------------------------------
注意!  你的密码,对于认证域:

   <svn://10.0.0.10:3690> My First Repository

只能明文保存在磁盘上!  如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?yes
A    sadoc/.bash_logout
A    sadoc/.tcshrc
A    sadoc/.viminfo
A    sadoc/.bash_profile
A    sadoc/.bash_history
A    sadoc/.subversion
A    sadoc/.subversion/servers
A    sadoc/.subversion/README.txt
A    sadoc/.subversion/auth
A    sadoc/.subversion/auth/svn.username
A    sadoc/.subversion/auth/svn.ssl.client-passphrase
A    sadoc/.subversion/auth/svn.ssl.server
A    sadoc/.subversion/auth/svn.simple
A    sadoc/.subversion/auth/svn.simple/02f30398314dca65b675ce5570f28e52
A    sadoc/.subversion/config
A    sadoc/anaconda-ks.cfg
A    sadoc/.bashrc
A    sadoc/.cshrc
取出版本 1。
[root@svn-client ~]# svn import /service/tools/jeesns.jsp svn://10.0.0.10/sadoc -m "version1"	#导入某个代码文件
[root@svn-client ~]# svn ls svn://10.0.0.10/sadoc		#查看svn中的数据

附:常用命令(参考自https://blog.csdn.net/liuchong_lch/article/details/78192755)

  • 1、将文件checkout到本地
svn checkout path(path是服务器的目录)
例如 :svn checkout svn://192.168.1.1/pro/domain
  • 2、往版本库中添加新的文件
svn add filename
例如:svn add test.cpp
  • 3、将改动的文件提交到版本库
svn commit -m "注释" [-N] [--no-unlock] PATH(如果选择了保持锁,就使用--no-unlock开关)
例如:svn commit -m "注释" test.cpp
简写:svn ci
  • 4、加锁/解锁
svn lock -m "注释" path
例如: svn lock -m "注释" test.cpp
svn unlock path
  • 5、更新到某个版本
svn update -r 版本号 path
svn update 更新当前目录以及子目录下的所有文件到最新版本
svn upate -r 200 test.cpp 将版本库中的test.cpp还原到版本200
简写 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 "注释"
例如: svn delete svn://192.168.1.1/pro/domain/test.cpp -m "delete test file"
或者直接svn delete test.php 然后再svn ci -m 'delete test file‘,推荐使用这种
简写: svn (del、remove、rm)
  • 8、查看日志
svn log path
  • 9、查看文件详细信息
svn info path
  • 10、比较差异
svn diff path(将修改的文件与基础版本比较)
svn diff -r m:n (将修改的文件m版本和n版本比较)
简写 svn di
  • 11、将两个版本的文件的差异合并到当前文件
svn merge -r m:n path
 例如:svn
 merge -r 20:25 test.cpp(将版本20与25之间的差异合并到当前文件,但一般会发生冲突,需要处理一下)
  • 12、SVN帮助
svn help

以上为常用命令,下面为不常用命令

  • 13、查看版本库下的文件和列表
svn list path (显示path目录下的所属于版本的文件和目录)
简写: svn ls
  • 14、创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法: 1、mkdir PATH...
    2、mkdir URL...

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

  • 15、恢复本地修改
svn revert:恢复原始未改变的工作副本文件(恢复大部分的本地修改)revert用法:revert path

注意:本子命令不会存储网络,并且会解除冲突的情况。但它不会恢复被创建的目录

  • 16、代码库URL变更
svn switch(sw): 更新工作副本到不同的URL。
用法 
1、switch URL [PATH]
2、switch --relocate FROM TO [PATH]

1、更新工作副本,映射到一个新的URL,会将服务上的文件与本地文件合并。这是将工作副本对应到同一创库的某个分支或者标记的方法。
2、改写工作副本URL元数据,以反映URL的变更,创库URL变动但工作副本仍旧对映同一创库的同一目录时使用该命令更新工作副本与创库的对应关系。

  • 17、解决冲突
svn resolved:移除工作副本的目录或文件的“冲突”状态。
用法 resolved path

注意:本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让path可以再次提交。

  • 18、输出指定文件的URL内容
svn cat 目标[@版本] 如果指定了版本将从指定的版本开始查找。

2.2、windows客户端使用svn

下载TortoiseSVN客户端下载地址,这个地址也提供了语言包的下载,选择需要下载的语言包,在安装完TortoiseSVN后安装语言包即可,图形界面使用简单使用指南,这里不想多说,可以参考此文章