1 Subversion简介


1. 背景

当一个项目由多个开发人员共同开发,而这些开发人员处在不同的地方或者无法在本地交流时,如何保证开发过程中项目版本的同步、更新、管理等是一个很重要的问题。版本控制软件是一个非常好的解决方案,能够保证项目开发的安全、同步和高效管理。Subversion是一款优秀的版本管理软件,做为cvs的接班人,是目前大多数开源软件都使用的代码版本管理软件。


2. 工作原理

Subversion是Apache软件基金会开发和维护的一个开源/自由的版本控制系统,在Subversion管理下,文件和目录可以超越时空,也就是Subversion的回滚机制允许你将数据恢复到早期版本(rollback),

或者是检查数据修改的历史,就像是一台时光机。

Subversion的版本库可以通过网络访问,从而使用户可以在不同的电脑上进行操作。从某种程度上来说,允许用户在各自的空间里修改和管理同一组数据可以促进团队协作。因为修改不再是单线进行,开发速度会更快。


Subversion的基本工作流程是:

在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序,由源代码库管理员统一管理这些源程序;

每个用户在使用源代码库之前,首先要把源代码库里的项目文件下载到本地,然后开发人员可以在本地修改,之后用svn命令进行提交,由源代码库统一管理修改。


Subversion的版本控制机制解决了以下问题:

  • 代码管理混乱

  • 代码冲突问题

  • 在代码整合期间引发的bug

  • 无法对代码的拥有者进行权限控制

  • 项目不同版本的发布困难


SVN工作原理示意图:

wKiom1NHVdmhtEnJAAEEfrwIljc953.jpg


2 SVN服务搭建


Subversion有两种运行方式:

一种是基于Apache Http Server,另外一种是Subversion Standalone Server。

以下是基于httpd的安装过程:


1. 环境部署

系统环境:CentOS 6.5 32位

安装方式:yun在线安装机制

软件版本:Apache Subversion 1.6.11


2. 安装前准备

检查是否安装了旧版本的SVN:

#rpm -qa | grep subversion

若有,卸载旧版本:

#yum remove subversion


3. 安装所需软件包

yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql mysql-server

说明:

  • subversion:SVN服务器

  • mysql-server,mod-auth-mysql:用于codestriker

  • httpd,httpd-devel,mod_dav_svn:用于支持Web方式管理SVN服务器


4. 确认已经安装svn模块

#ls /etc/httpd/modules | grep svn

mod_authz_svn.so

mod_dav_svn.so

检查SVN版本信息:

#svnserve --version

svnserve, version 1.6.11 (r934486)
  compiled Mar  6 2014, 10:33:29

Copyright (C) 2000-2009 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_base : Module for working with a Berkeley DB repository.
* fs_fs : Module for working with a plain file (FSFS) repository.

Cyrus SASL authentication is available.


5. 创建Subversion初始代码库

#mkdir -p /opt/svn/repositories

#svnadmin create --fs-type fsfs /opt/svn/repositories/

执行上面的命令后,自动建立repositories库,查看/opt/svn/repositories 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。

Subversion目录说明:

  • dav 目录: 是提供 apache 与 mod_dav_svn 使用的目录,让他们存储内部数据

  • db 目录: 是所有版本控制的数据存放文件

  • hooks 目录: 放置 hook 脚本文件的目录

  • locks 目录: 用来放置 subversion 建库锁定数据的目录,用来追踪存取文件库的客户端

  • format 文件: 是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号

  • conf 目录: 是这个仓库的配置文件(仓库的用户访问账号、权限等)


6. Subversion导入初始项目

#svn import /path/to/your/project file:///opt/svn/repositories --message "init"

通过svnlook查看项目库信息:

svnlook info /opt/svn/repositories/


7. 配置代码库

添加用户:vim /opt/svn/repositories/conf/passwd

[users]
# harry = harryssecret
# sally = sallyssecret
rango = password

注解:添加对应的条目可增加多个用户


修改用户访问策略:vim /opt/svn/repositories/conf/authz

[groups]
admin = rango
[admin:/]
@admin = rw
[/]
* = r
[$name:/]
test = rw">>/opt/svn/puppet/conf/authz

注解:此处设置了只有用户rango拥有根目录的读写权(rw),其他用户只有读权限。


修改svnserve.conf,使用户和策略配置生效:

[general]

#定义非授权用户的访问权限,有三种方式:none-限制访问,read-只读,write-读写,默认为read

anon-access = none

#定义授权用户的访问权限,有三种方式:none-限制访问,read-只读,write-读写,默认为write

auth-access = write

#定义保存用户名和密码的文件路径
password-db = /opt/svn/project/conf/passwd

#定义保存授权信息的路径
authz-db = /opt/svn/project/conf/authz

#定义客户端连接的认证命名空间,SVN会在认证提示里显示,并且作为凭证缓存的关键字
realm = My Repository


8. 配置防火墙

Subversion利用tcp 3690端口:

#vim /etc/sysconfig/iptables

#add following entry

-A INPUT -m state --state NEW -m tcp -p tcp  --dport 3690 -j ACCEPT

保存后重启iptables:

#service iptables  restart


9. 启动SVN服务

#svnserve -d -r /opt/svn/repositories

注解:-d表示以daemon,即后台方式启动

-r指定代码根目录


查看SVN服务:

#ps aux | grep svn | grep -v grep

root     11248  0.0  0.0  13200   896 ?        Ss   11:22   0:00 svnserve -d -r /opt/svn/repositories


检测SVN端口:

#netstat -ln | grep 3690

tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN


停止、重启SVN服务:

#killall svnserve                                    #停止

#svnserve -d -r  /opt/svn/repositories  // 启动


10. 配置Apache模块通过Web来访问Subversion版本库

编辑/etc/httpd/conf.d/subversion.conf,添加以下信息:

<VirtualHost *:8146>
<Location /svn>
  DAV svn
  SVNParentPath /opt/svn
  AuthType Basic
  AuthName "Subversion Realm"
  SVNListParentPath on
  AuthUserFile /opt/svn/puppet/conf/authfile
#   AuthzSVNAccessFile /opt/svn/puppet/conf/svn-acl-conf
  Require valid-user
  SVNAutoversioning on
  ModMimeUsePathInfo on
</Location>
</VirtualHost>


创建/etc/httpd/conf.d/svn_user_list /etc/httpd/conf.d/project.access 权限文件:

#htpasswd -c /etc/httpd/conf.d/svn_user_list rango   #创建用户列表

#vim /etc/httpd/conf.d/project.access:

[repositories:/]
rango = rw
[repositories:/test]
rango = r


重启apache,通过http://server_ip:8146/svn/repositories/ 访问,如果页面出现,说明配置成功

注解:/opt/svn/repositories目录要能被apache运行用户(apache)读写:

chown -R apache.apache /opt/svn/repositories/


11. 删除一个版本库

svn delete 只会删除版本库中的文件,svnadmin 也没有提供删除版本库的子命令。只能在 SVN 服务器端强制删除文件:

#rm -rf /path/to/your/repositories/


12. SVN代码库的访问方式

(1) 直接访问本地硬盘文件仓库(file://):

svn co file:///path/to/your/project 或者

svn cofile://localhost/path/to/your/project/

ps:checkout (co): 从版本库签出工作副本。


(2) 通过WebDAV 协议访问(http://)


(3) 通过具有安全套接字(SSL)的WebDAV 协议访问(https://)


(4) 通过自带协议访问svnserve服务器(svn://)

svn co svn://hostname/repositoriesrepositories --username user_name


(5) 通过具被SSH隧道保护的自带协议访问(svn+ssh://)

svn cosvn+ssh://hostname/opt/svn/repositories repositories --usernameuser_name

注意:在这种方式下,您必须使用完整的路径(/opt/svn/repositories)来访问SVN 文件仓库

                                                                                                                               ——游响云停