搭建SVN版本控制服务器
一:实验目标
实战:搭建svn服务器+ apache版本控制服务器
二:实验环境
系统版本: rhel-server-6.5-x86_64-dvd
SVN+apache服务端:xuegod63.cn IP:192.168.1.63
客户端:xuegod64.cn IP:192.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.apache和mod_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仓库的名字命名并创建对应的目录。
方法二:通过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/