首页 > 代码库 > 搭建SVN版本控制服务器

搭建SVN版本控制服务器

搭建SVN版本控制服务器

一:实验目标

实战:搭建svn服务器+ apache版本控制服务器 

二:实验环境

                 系统版本: rhel-server-6.5-x86_64-dvd

SVN+apache服务端:xuegod63.cn IP192.168.1.63

客户端:xuegod64.cn IP192.168.1.64

服务概述:

    由于各个公司所对服务的需求不同,会安装各种不同版本的服务软件,所以管理起来会很困难。在此环境中,会出现代码冲突,项目不同版本的发布困难甚至代码整合期间会出现bug。如果一个项目是由多个开发人员共同开发的,但是这些个开发人员都不在个地方,那么如何来完成这个项目的开发呢?随着问题的出现,应运而生了各种版本控制软件。其中市场上较为常见的版本控制软件有cvs,svn和git。Cvs已经成为了过去式,svn是当下较为流行的,是cvs的接班人。

 

Svn的运行模式有两种

模式

端口

运行模式

svn

3690

C/S

svn+apache

80

C/S

svn的基本工作原理:

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

技术分享 

mod_dav_svn的作用

     由于Subversion需要版本化的控制,因此标准的HTTP协议不能满足需求。要让Apache与Subversion协同工作,就要使用WebDAV(Web-basedDistributedAuthoringandVersiong)Web分布式创作和版本控制协议。WebDAV是HTTP1.1的扩展,关于WebDAV的规范和工作原理,可以参考IETFRFC2518。简单的说mod_dav_san模块就是作为Subversion与Apache之间的接口的连接线,通过它,Apache就可以访问版本库,并且可以让客户端也使用HTTP的扩展协议WebDAV/DeltaV进行访问

 

三:实验代码

环境安装svn.apachemod_dav_svn模块  

[root@xuegod64 ~]# vim /etc/services

技术分享 

[root@xuegod63~]#yum install subversion httpd mod_dav_svn -y

 

配置xuegod63上的svn服务器

1建立一个用户,用于管理SVN版本库类似于这个库的管理员

[root@xuegod63~]#useradd svn


2创建版本库目录,并修改相应权限管理员对这个库的权限

[root@xuegod63~]#mkdir /var/repos

[root@xuegod63~]#chown svn.svn /var/repos


3创建两个项目仓库。 svn1和svn2

[root@xuegod63 ~]# su - svn

[svn@xuegod63 ~]$ svnadmin create /var/repos/svn1   

[svn@xuegod63 ~]$ svnadmin create /var/repos/svn2 #管理员创建版本控制仓库svn

[svn@xuegod63 ~]$ cd /var/repos/svn1

[svn@xuegod63 svn1]$ ls

conf  db  format  hooks  locks  README.txt

[svn@xuegod63 svn1]$ ls conf/

authz  passwd  svnserve.conf 

 

查看配置中的各个文件的作用

[root@xuegod63 repos]# cat /var/repos/svn1/conf/authz

注释: 

每个文件的作用

Authz

权限

Passwd

用户名和密码

svnserve.conf

服务器的配置文件

 

[root@xuegod63 repos]# cat /var/repos/svn1/conf/svnserve.conf

anon-access = none

#匿名访问的权限,可以是read,write,none,默认为read,如果你不愿意匿名共享请配置为none

auth-access=write

#认证用户的权限,可以是read,write,none,默认为write

password-db=passwd

#密码数据库的路径,去掉前面的#,默认使用的是同一目录下的passwd文件作为用户认证方式

authz-db=authz

#权限验证文件

realm=svn1

#此选项指定库的认证领域。

 

[root@xuegod63 conf]# cat /var/repos/svn1/conf/passwd

注:格式为:用户名=密码

注意

1.

一定要去掉[users]前面的#,否则svn只能以匿名用户登录,客户端不会出现登录窗口戒密码提示,除非你的anon不为none,否则将迒回一个错误。

2.

里的密码都是明文没有加密的。

 

4:修改配置文件authz

[root@xuegod63 conf]# vim /var/repos/svn1/conf/authz #在最后添加以下内容:

参数说明:[groups]

Admin = tube

#创建一个组admin,admin组中有成员tube。

[/] @admin = rw

#表示admin组中所有成员,可以读写/var/repos中所有文件。

[/var/repos/svn1]

user1 = rw

rw(表示user1能够读写/var/repos/svn1目录下的所有信息)

[/var/repos/svn2]

user2=r 

user2=r(表示user2能够读/var/repos/svn2目录下的所有信息)

 

5:启动SVN服务器

#使用用户svn来管理版本库目录/var/repos,则须转为svn用户,命令如下: 

[svn@xuegod63 conf]$ svnserve -d -r /var/repos/

d

表示以daemon方式(后台运行)运行

r

指定根目录是/var/repos

[svn@xuegod63 conf]$ netstat -antup | grep 3690

tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 7262/svnserve

 

6:iptables开放服务器端口 :svn默认端口是3690

[root@xuegod63 ~]# iptables -A INPUT -p tcp --dport 3690 -j ACCEPT

[root@xuegod63 ~]# /etc/init.d/iptables save

 

7:管理员上传源代码到库中

[root@xuegod63 ~]# cp extundelete-0.2.4.tar.bz2 /home/svn #拷贝到管理员家中

[svn@xuegod63 ~]$ tar jxvf extundelete-0.2.4.tar.bz2

[svn@xuegod63 ~]$ mv extundelete-0.2.4 extundelete

[svn@xuegod63 ~]$ cd extundelete

[svn@xuegod63 extundelete]$ ls

acinclude.m4  config.h.in   depcomp     Makefile.am  README

aclocal.m4    configure     install-sh  Makefile.in  src

autogen.sh    configure.ac  LICENSE     missing

 

 

8:管理员把源代码导到SVN服务器上--独立服务器的方式

[svn@xuegod63 ~]$ svn import extundelete/ file:///var/repos/svn1 -m ‘svn v1‘技术分享 

 

9:查看apache支持subversion两个动态库有没有安装成功。  

[root@xuegod63 conf]# vim /etc/httpd/conf.d/subversion.conf #看到下面配置文件中两个模块相关信息,说明安装成功。

LoadModule dav_svn_module    modules/mod_dav_svn.so

LoadModule authz_svn_module  modules/mod_authz_svn.so

 

配置xuegod63上的apache服务器

1:配置apache支持SVN

[root@xuegod63 ~]# vim /etc/httpd/conf/httpd.conf #apache使用的用户和组都改为svn的管理员

User svn

Group svn

 

2:配置apache下的svn,知道仓库,认证路径等

[root@xuegod63 ~]# vim /etc/httpd/conf.d/subversion.conf

<Location /svn>

DAV svn

SVNParentPath /var/repos #仓库的根目录

AuthType Basic  #认证类型

AuthName "Subversion repository"  #认证窗口,弹出的消息

AuthUserFile /home/svn/passwd  #认证用户的路径

AuthzSVNAccessFile /home/svn/auth  #建立本地项目版本库的权限控制文件

Require valid-user

</Location>

 

3:建立访问控制文件/home/svn/passwd---类似于代码开发人员的用户

#后期通过httpd服务器访问svn时,会使用个文件中的用户信息验证用户和密码。

生成用户和密码的工具

[root@xuegod63 ~]# which htpasswd

/usr/bin/htpasswd

[root@xuegod63 ~]# rpm -qf /usr/bin/htpasswd

httpd-tools-2.2.15-29.el6_4.x86_64  

[root@xuegod63 ~]# htpasswd -c /home/svn/passwd tube # -c #如果没有/home/svn/passwd则创建。会提示你输入密码,默认是MD5加密

New password: 123456

Re-type new password: 123456

[root@xuegod63 ~]# htpasswd /home/svn/passwd mk #后期再创建时,就不需要加-c参数,否则,会把之前添加到/home/svn/passwd中信息,全部覆盖。

[root@xuegod63 ~]# htpasswd /home/svn/passwd testuser3

查看用户名和密码:

[root@xuegod63 ~]# cat /home/svn/passwd

tube:ll7IH3i5G0JfU

mk:KvoOCCmj2qla2

testuser3:tSp3bA63WPGXU

 

4:建立本地项目版本库的权限---类似于代码开发人员的权限

[root@xuegod63 ~]# vim /home/svn/auth #写入以下内容

[/]

tube = rw

[svn1:/]

@group1 = rw

 = rw

[svn2:/]

@group2 = rw

[groups]

group1 = testuser1,testuser2

group2 = testuser3,testuser4

 

解释:

[/] # 表示所有仓库的根目录

tube = rw # 表示tube用户对所有仓库的根目录都有rw权限 

[svn1:/] #表示仓库svn1的根目录

@group1 = rw #group1组中的用户对svn1仓库有读写权限 如果在前面加上@符号,则表示是个群组权限设置,

mk = rw # mk用户对svn1仓库具有读和写权限

[svn2:/]

@group2 = rw

[groups]

group1 = testuser1,testuser2 // 个表示某群组里的成员

group2 = testuser3,testuser4

 

5:重启httpd服务,访问svn

[root@xuegod63 ~]# service httpd restart

用户的作用总结

用户名

对所属库的权限

Svn

是svn服务器中的库管理员

Tube

是对整个svn库拥有读写权限

Mk

是对svn库中的svn1库拥有读写权限,类似于开发人员

Testuser3

是对svn库中的svn2库拥有读写权限,并且Testuser3属于group2类似于开发人员

测试svn版本控制服务器

 

svn的访问地址是: http://192.168.1.63/svn/svn1

1:测试开发人员对不同库的访问权限:

   1)http://192.168.1.63/svn/svn1 ,输入用户: mk 密码: 123456

 

技术分享

技术分享

 

  2)http://192.168.1.63/svn/svn2 ,输入用户: mk 密码: 123456

 

技术分享

技术分享

 

   3)http://192.168.1.63/svn/svn2/ 用户:testuser3 ,密码:123456 可以访问svn2

技术分享

技术分享

 

 

2:测试开发人员对库中采取的不同动作

1) 把本地项目extundelete-0.2.4.tar.bz2整个源代码导入到版本库: svn2中。 没有导入前,svn2仓库初始版本为 0

语法:svn 源代码目录 file:///path/to/repos -m "最后的个注释不能少"

[svn@xuegod63 ~]$mkdir test1

[svn@xuegod63 ~]$ tar jxvf extundelete-0.2.4.tar.bz2

[svn@xuegod63 ~]$svn import extundelete-0.2.4/ file:///var/repos/svn2 -m ‘svn2 v1‘

技术分享 

#这里不再为0,显示为1,说明监控版本变化成功

 

2)取回项目代码

方法1直接在svn中取回

语法:svn checkout file:///var/repos/svn1 目录

[svn@xuegod63 ~]$ svn checkout file:///var/repos/svn1  new

或者

[svn@xuegod63 ~]$ svn checkout file:///var/repos/svn1

#将svn1版本库中的文件取回到目录aaaa中,没有aaaa目录,将自动生成一个aaaa目录。 如果不指定目录,直接存到当前目录下,将以svn1仓库的名字命名并创建对应的目录。

技术分享#除了代码以外,多了一个 .svn 目录

 

方法二:通过http协议

[svn@xuegod63 ~]$svn checkout http://192.168.1.63/svn/svn1 bbb

Authentication realm: <http://192.168.1.63:80> Subversion repository

Password for ‘root‘: 直接回车

Authentication realm: <http://192.168.1.63:80> Subversion repository

Username: mk

Password for ‘‘:123456

技术分享 

 

3:xuegod64中测试testuser3访问:

[root@xuegod64 ~]# svn checkout http://192.168.1.63/svn/svn1 bbb

Authentication realm: <http://192.168.1.63:80> Subversion repository

Username: testuser3

Password for ‘testuser3‘:

svn: Server sent unexpected return value (403 Forbidden) in response to OPTIONS request for ‘http://192.168.1.63/svn/svn1‘

 

4:修改添加删除文件后,提交代码。

[root@xuegod63 test3]# svn checkout http://192.168.1.63/svn/svn1 extundelete

Authentication realm: <http://192.168.1.63:80> Subversion repository

Password for ‘mk‘:

[svn@xuegod63 ~]$ cd extundelete

[svn@xuegod63 ~]$ cp /etc/hosts c.txt

[svn@xuegod63 ~]$cp /etc/hosts b.txt

[svn@xuegod63 ~]$ cp /etc/hosts a.txt

[svn@xuegod63 ~]$ svn add c.txt #添加一个文件到版本库中

A   c.txt

[root@xuegod63 svn1]# svn delete autogen.sh #从版本库中删除一个文件

D  autogen.sh

[root@xuegod63 extundelete-0.2.4]# ls #查看,没有没有autogen.sh 文件了

[root@xuegod63 extundelete]# svn status #查看项目当前状态。

? a.txt

? b.txt

A c.txt

D autogen.sh

 

提交修改:

[root@xuegod63 extundelete-0.2.4]# svn commit -m #"注释,添加一个文件c.txt" #提交你的改变到版本库中,后面参数为此次提交的注释.

[root@xuegod63 extundelete-0.2.4]# svn list # 列出版本库中当前目录下的文件 

[root@xuegod63 extundelete]# svn move c.txt mk.txt #c.txt文件更名为mk.txt

A mk.txt

D c.txt

 

5:xuegod64取出版本: 

[root@xuegod64 svn1]# svn checkout http://192.168.1.63/svn/svn1/

[root@xuegod64 svn1]# svn co http://192.168.1.63/svn/svn1/ 


本文出自 “末班车” 博客,请务必保留此出处http://blxueyuan.blog.51cto.com/9673381/1864400

搭建SVN版本控制服务器