CentOS+SVN 服务器搭建

23 Jan 2013

平台环境

  • CentOS 6.X (同样适用其他 Linux 发行版本)
  • 服务器节点 192.168.1.101

SVN 简介&工作原理

subversion(简称svn)是近几年崛起的版本管理软件,是 cvs 的接班人,目前绝大多数开源软件都使用 svn 作为代码版本管理软件。Subversion 支持 linux 和 windows,但较多安装在 linux 下。

svn 服务器有两种运行方式: 独立服务器和借助于 apache。 svn:// 或 http://

svn 客户端 tortoisesvn

svn 的基本工作原理: 在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序。有源代码库管理员统一管理这些源程序。每个用户在使用源代码库之前,首先要把源代码库里的项目文件下载到本地,然后开发人员可以在本地修改,之后用 svn 命令进行提交,由源代码库统一管理修改。

版本控制解决了:

  • 代码管理混乱
  • 解决代码冲突困难
  • 在代码整合期间引发 bug
  • 无法对代码的拥有者进行权限控制
  • 项目不同版本的发布困难

SVN 工作原理示意图:

subversion目录说明:

  • dav 目录: 是提供 apache 与 mod_dav_svn 使用的目录,让他们存储内部数据
  • db 目录: 是所有版本控制的数据存放文件
  • hooks 目录: 放置 hook 脚本文件的目录
  • locks 目录: 用来放置 subversion 建库锁定数据的目录,用来追踪存取文件库的客户端
  • format 文件: 是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号
  • conf 目录: 是这个仓库的配置文件(仓库的用户访问账号、权限等)

SVN Server 详细配置

系统环境: CentOS 6.3 最小化安装(关闭 iptables 和 selinux) + ssh + yum

Step1 安装必须软件包

$ yum install subversion mysql-server httpd mod_dav_svn mod_perl sendmail wget gcc-c++ make unzip perl* ntsysv vim-enhanced
  • subversion (SVN 服务器)
  • mysql-server (用于 codestriker)
  • httpd mod_dav_svn mod_perl (用于支持 WEB 方式管理 SVN 服务器)
  • sendmail (用于配置用户提交代码后发邮件提醒)
  • wget gcc-c++ make unzip perl* (必备软件包)
  • ntsysv vim-enhanced (可选)

Step2 SVN Server 配置

Step2-1 新建用于存储 SVN 文件的目录

$ mkdir /home/hadoop/svn

Step2-2 新建一个版本仓库

$ svnadmin create /home/hadoop/svn/project

Step2-3 初始化版本仓库中的目录

# 建立临时目录
$ mkdir project project/server project/client project/test
$ svn import project/ file:///home/hadoop/svn/project -m “初始化SVN目录”
# 删除临时建立的目录
$ rm -rf project

Step2-4 添加用户

添加 SVN 用户非常简单,只需在 /home/hadoop/svn/project/conf/passwd 文件添加一个形如 “username = password” 的条目就可以了。

[users]
# harry = harryssecret
# sally = sallyssecret
pm = pm_pw
server_group = server_pw
client_group = client_pw
test_group = test_pw

Step2-5 修改用户访问策略

/home/hadoop/svn/project/conf/authz 记录用户的访问策略

[groups]
project_p = pm
project_s = server1,server2,server3
project_c = client1,client2,client3
project_t = test1,test1,test1

[project:/]
@project_p = rw
* =

[project:/server]
@project_p = rw
@project_s = rw
* =

[project:/client]
@project_p = rw
@project_c = rw
* =

[project:/doc]
@project_p = rw
@project_s = r
@project_c = r
@project_t = r
* =

以上信息表示,只有 project_p 用户组有根目录的读写权。r 表示对该目录有读权限,w 表示对该目录有写权限,rw 表示对该目录有读写权限。最后一行的 * = 表示,除了上面设置了权限的用户组之外,其他任何人都被禁止访问本目录。这个很重要,一定要加上!

Step2-6 修改 svnserve.conf 文件,使用户和策略配置生效

[general]
# 定义非授权用户的访问权限,有三种方式: none(限制访问), read(只读), write(读写),默认为 read 
anon-access = none
# 定义授权用户的访问权限,有三种方式: none(限制访问), read(只读), write(读写),默认为 write
auth-access = write
# 定义保存用户名和密码的文件名称,这里为 passwd,和该文件位于同一目录
password-db = /home/hadoop/svn/project/conf/passwd
# 定义保存授权信息的文件名称,这里为 authz,和该文件位于同一目录
authz-db = /home/hadoop/svn/project/conf/authz
# 定义客户端连接是的“认证命名空间”, SVN 会在认证提示里显示,并且作为凭证缓存的关键字
realm = My First Repository

Step2-7 启动服务器

$ svnserve -d -r /home/hadoop/svn
# -d表示以 daemon 方式(后台运行)运行
# -r 指定根目录

如果修改了 svn 配置,需要重启 svn 服务,步骤如下:

# svn 服务端口号: 3690
$ ps -aux|grep svnserve
$ kill -9 ID号
$ svnserve -d -r /home/hadoop/svn

Step2-8 测试服务器

$ mkdir test
$ cd test
$ svn co svn://192.168.1.101/project
Authentication realm: <svn://192.168.1.101:3690>
Password for 'root':
Authentication realm: <svn://192.168.1.101:3690>
Username: server_group
Password for 'server_group':
svn: Authorization failed ( server_group没用根目录的访问权 )

$ svn co svn://192.168.1.101/project
Authentication realm: <svn://192.168.1.101:3690>
Password for ‘root’:
Authentication realm: <svn://192.168.1.101:3690>
Username: pm
Password for ‘pm’:
A    project/test
A    project/server
A    project/client
Checked out revision 1.  ( 测试提取成功 )

$ cd project/server
$ vim main.c
$ svn add main.c
$ svn commit main.c -m “test”
Adding    main.c
Transmitting file data .
Committed revision 2.  ( 测试提交成功 )

Step2-9 删除一个版本仓库

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

# $REPOS_PATH 是创建版本仓库时使用的地址 svnadmin create $REPOS_PATH
$ rm -rf $REPOS_PATH

Fork me on GitHub