运维管理 ·

SVN 版本控制服务

SVN版本控制服务

SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。也是就是CVS的接班人!

CVS是一个C/S系统,是一个常用的代码版本控制软件。主要在开源软件管理中使用。与它相类似的代码版本控制软件有subversion。多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。CVS版本控制系统是一种GNU软件包,主要用于在多人开发环境下的源码的维护。但是由于之前CVS编码的问题,现在大多数软件开发公司都使用SVN替代了CVS。

官方网站:http://subversion.apache.org/        Windows客户端 TortoiseSVN:http://tortoisesvn.net/

常见的版本控制软件

CVS,逐渐被SVN取代,是CVX重写版和改写版

SVN,Subversion

Git,Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件

SVN存储数据的方式

BDB,Berkeley DB,一种事务安全型表类型

FSFS,"FSFS" 采用文件系统的方式, 替代原来的基于Berkeley DB的实现.

因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。

SVN的运行方式及端口

独立服务器             3690端口              访问方式SVN://    C/S模式  file:///

借助apache运行           80端口           访问方式 http://

工作流程

集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解

决冲突,提交。所有的版本信息都放在服务器上。如果脱离了服务器,开发者基本上可以说是无法工作的。下面举例说

明:开始新一天的工作:

1、从服务器下载项目组最新代码。

2、进入自己的分支,进行工作,每隔一个小时向服务器自己的分支提交一次代码(很多人都有这个习惯。因为有时候自己对代码改来改去,最后又想还原到前一个小时的版本,或者看看前一个小时自己修改了哪些代码,就需要这样做了)。

3、下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。

这就是经典的svn工作流程,从流程上看,有不少缺点,但也有优点。

相对CVS优缺点

CVS和SVN,我们可以认为SVN取代了CVS,但是不认为SVN替代了CVS!它们是两个不同的系统,对比优缺点

1:存储类型格式,CVS是基于RCS文件的版本控制系统,SVN是基于BDB和FSFS(二进制文件)的系统

2:速度,SVN比CVS快很多

3:标志&分支:SVN的整个仓库都有版本号,不是针对某一个文件

4:元数据:CVS只能存储文件,SVN允许一个文件有任意多的可命名属性

5:文件类型:CVS是为文本文件存储设计,因此对其他文件如二进制支持没有,SVN会关心所有文件

6:回滚:CVS允许任意回滚,SVN不允许递交后回滚,建议把版本库里好的状态版本加到末尾,覆盖掉损坏的版本。而损坏的版本无论如何也是会存在数据库里的。

7:事物:CVS中的“零或一”事务原则根本没有实现。SVN的确支持“零或一”事务原则,这是SVN的一大优势。关于实物:理解为完成和没有完成,如果几个人在编辑此份,提交后,可能是部分人员完成,部分人员没完成,结果就是最终提交后重复。这两就会出现两个阶段的代码!

SVN+Apache运行原理

SVN搭配Apache的时候,Apache需要使用mod_dav_svn这个模块,他的运行机制如下:
SVN 版本控制服务 fooher.com

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

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

mod_dav_svn 可以让版本库通过http协议实现网站展现

构建SVN版本控制服务器

SVN+HTTP Server (Node63)==================== Client Server(Node64)

构建SVN版本控制服务器

SVN+HTTP Server (Node63)==================== Client Server(Node64)

软件安装

[root@Node63 ~]# yum install -y subversion httpd mod_dav_svn                     //包括HTTP所需模块一起装

[root@Node63 ~]# cat /etc/services | grep --color svn                                          //查看已注册

svn             3690/tcp                        # Subversion

svn             3690/udp                        # Subversion

创建版本库目录

[root@Node63 ~]# mkdir /webdept                                                                  //存放版本库的主目录

[root@Node63 ~]# svnadmin create /webdept/www.fooher.com

[root@Node63 ~]# svnadmin create /webdept/www.fuowa.com          //创建两个版本库

svnadmin命令是由subversion这个软件包提供的

[root@Node63 ~]# ls /webdept/www.fooher.com/                                      //随便查看一个版本库

conf  db  format  hooks  locks  README.txt

***************************************************************************************************************

dav目录:是提供apache与mod_dav_svn使用的目录,让他们存储内部数据,刚开始新建时此目录没有

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

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

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

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

conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等),也是我们要关注的配置文件

[root@Node63 ~]# ls /webdept/www.fooher.com/conf/

authz  passwd  svnserve.conf

authz                                  #认证权限相关

passwd                              #用户名和密码

svnserve.conf                  #服务器配置文件

[root@Node63 ~]# vim /webdept/www.fooher.com/conf/svnserve.conf     //修改 foohercom.cn的配置文件

[general]

anon-access = none                   #原先注释掉了,匿名用户可以读,使用none的话就是匿名用户不可以访问

auth-access = write                    #这几行都要取消注释,认证用户可以写,可以是read,write,none

password-db = passwd             #密码库文件,默认使用的是同一目录下的passwd文件作为用户密码库

authz-db = authz                       #认证权限文件

realm = www.fooher.com        #登陆提示信息

注意:此配置文件的所有内容必须顶格,否则会报错

配置用户和密码及认证权限

[root@Node63 ~]# vim /webdept/www.fooher.com/conf/passwd               //设置用户名和密码

[users]

Find = 123456

HA = 123456

user = 123456

#末尾添加上面三行

#对于部分版本,前面的[users]是有#号的,如果有#号,一定要取消,否则只能使用匿名用户登录,客户端登录不会

出现登录窗口或密码提示,除非在配置文件将anon设置为none,否则将返回一个错误

#这里的密码都是明文,没有加密

[root@Node63 ~]# vim /webdept/www.fooher.com/conf/authz           //设置用户和组的权限

[groups]                                    #此行默认存在了

Check = Find,HA                     #定义组,在[groups]下面添加

#用户组格式 用户组名 = 用户1,用户2

#一个组可以包含多个用户,英文逗号间隔,用户名必须是在passwd中存在的

[/]                                      #/表示我当前所在版本库目录,这里代表www.fooher.com

user = rw

@Check = r                         #@Check表示这个组的权限,就是上面定义的组的成员

* =                                      #除了上面的有赋予权限成员之外,其他的成员都没有权限

SVN目录格式:

[/目录名]

@用户组名 = 权限

用户名 = 权限

* =

[root@Node63 ~]# svnserve -d -r /webdept/         //启动了所有版本库,如果只需要某一个版本库,在-r

后面添加/webdept/www.fooher.com/的版本库即可      -d=daemon -r=root of directory of save指定根目录

注意,如果你启动了某一个版本库,在以后的操作中”/”就是这个版本库的目录,如果后面你跟上了“目录”在访问的时候直接访问IP的时候,就是这个版本库,会在这个版本库里面创建这个目录,同时我们也可以使用这种方式为在版本库的目录中新建子目录!

[root@Node63 ~]# ps -aux | grep svn                           //查询到下面这行内容就可以了

root   48612  0.0  0.1 183112  1076 ?   Ss   11:03   0:00 svnserve -d -r /webdept/

[root@Node63 ~]# netstat -antup | grep svn                 //服务正常

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

使用svn导入测试代码

导入测试代码格式:   svn [选项] 源码  svn://server ip/项目名

常见的选项:

import:将未版本化的文件纳入版本控制并提交                           checkout:从版本库中检出一个修订版          update:更新工作拷贝                                         add,delete,copy,move:增、删、复制、移动文件或目录

status:检查状态差异                                               diff:检查文件行级详细差异

revert:恢复                                                                  resolve:解决冲突

switch:切换工作拷贝对应的版本库分支           log:查看历史记录

list:显示文件目录                                                   cat:查看某个文件内容

[root@Node63 ~]# mkdir localsvn

[root@Node63 ~]# cd localsvn;touch 1.html 2.html ; cd

[root@Node63 ~]# svn import /root/localsvn/ file:///webdept/www.fooher.com/ -m "第一次修改代码"

//本地导入代码,使用file,仅仅能在服务器本地导入, -m=messages,注释,首次加入代码使用import

Adding         /root/localsvn/1.html

Adding         /root/localsvn/2.html

Committed revision 1.

客户端上传代码

[root@Node64 ~]# mkdir editwebsite                           //专门存放源码目录

[root@Node64 ~]# cd editwebsite/

[root@Node64 editwebsite]# touch 3.html 4.html ; cd

[root@Node64 ~]# svn import /root/editwebsite/ svn://192.168.1.63/www.fooher.com -m "第二次添加代码"                                    //客户端命令行使用svn命令导入代码的方法

Authentication realm: <svn://192.168.1.63:3690> www.fooher.com

Password for 'root':

Authentication realm: <svn://192.168.1.63:3690> www.fooher.com

Username: user              #输入user用户,user才能写

Password for 'user':        #输入密码

-----------------------------------------------------------------------

ATTENTION!  Your password for authentication realm:

<svn://192.168.1.63:3690> www.fooher.com

can only be stored to disk unencrypted!  You are advised to configure

your system so that Subversion can store passwords encrypted, if

possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value

of the 'store-plaintext-passwords' option to either 'yes' or 'no' in

'/root/.subversion/servers'.

-----------------------------------------------------------------------

Store password unencrypted (yes/no)? no         #不要存储密码

Adding         /root/editwebsite/3.html

Adding         /root/editwebsite/4.html

Committed revision 2.                                             #版本号已经变了

代码取出

[root@Node63 ~]# svn checkout svn://192.168.1.63/www.fooher.com downsource

//代码取出到downsource,会在当前目录新建这个目录

Authentication realm: <svn://192.168.1.63:3690> www.fooher.com

Password for 'root':        #root是默认的,直接回车

Authentication realm: <svn://192.168.1.63:3690> www.fooher.com

Username: Find              #Find有r权限,使用r获取

Password for 'Find':        #密码

-----------------------------------------------------------------------

ATTENTION!  Your password for authentication realm:

<svn://192.168.1.63:3690> www.fooher.com

can only be stored to disk unencrypted!  You are advised to configure

your system so that Subversion can store passwords encrypted, if

possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value

of the 'store-plaintext-passwords' option to either 'yes' or 'no' in

'/root/.subversion/servers'.

-----------------------------------------------------------------------

Store password unencrypted (yes/no)? no     #不保存

A    downsource/1.html

A    downsource/2.html

A    downsource/3.html

A    downsource/4.html

Checked out revision 2.

代码添加

[root@Node63 ~]# cd downsource/                                   //进入你取下代码的目录

[root@Node63 downsource]# touch 5.html                    //新建代码

[root@Node63 downsource]# svn add 5.html                //添加到SVN服务中

[root@Node63 downsource]# svn commit -m "第三次添加代码"                  //添加到服务器上

root      44135  0.0  0.1 183112  1076 ?        Ss   13:40   0:00 svnserve -d -r /webdept/Authentication realm: <svn://192.168.1.63:3690> www.fooher.com

Password for 'Find':            #Find没有权限,回车换user

Authentication realm: <svn://192.168.1.63:3690> www.fooher.com

Username: user                  #user用户有权限

Password for 'user':

-----------------------------------------------------------------------

ATTENTION!  Your password for authentication realm:

<svn://192.168.1.63:3690> www.fooher.com

can only be stored to disk unencrypted!  You are advised to configure

your system so that Subversion can store passwords encrypted, if

possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value

of the 'store-plaintext-passwords' option to either 'yes' or 'no' in

'/root/.subversion/servers'.

-----------------------------------------------------------------------

Store password unencrypted (yes/no)? no

Adding         5.html

Transmitting file data .

Committed revision 3.

拓展:commit,SVN的提交是将在工作空间做的修改进行提交,包括文件内容的修改,文件或目录的添加,删除,命名,移动等操作。开发项目时,你会在工作拷贝中修改项目的代码,你总要把修改之后做过的改动又存回到项目仓库中去。这个过程称为“提交”。提交是将你对工作拷贝所作的所有改动发送并存储到中央项目仓库中。

add 功能:向文件拷贝所在的文件夹中添加新的文件,并作出标识,是新添加的,下一步提交时将一并提交到Subversion版本库中去。简单的说就是将一新文件加入svn,你添加再提交后该文件就进入subversion版本中去了;

checkout:check out导出获得文件后,导出的文件仍处于SVN版本控制中,与版本库保持关联,比如你可以进行Svn Update或者Svn Commit操作,checkout是第一次用,后面的用法就是更新

SVN+Apache

SVN+Apache的需要subversion的两个动态库支持,同时我们需要密码的验证支持!

查看apache对svn模块的支持

[root@Node63 ~]# 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

[root@Node63 ~]# ls /etc/httpd/modules/mod_dav_svn.so /etc/httpd/modules/mod_authz_svn.so

/etc/httpd/modules/mod_authz_svn.so  /etc/httpd/modules/mod_dav_svn.so

#两个模块对应的物理路径

配置apache支持svn

[root@Node63 ~]# vim /etc/httpd/conf.d/subversion.conf                //末尾添加这些行

<Location /webdept>

DAV svn

SVNParentPath /webdept                                           #svn根目录

AuthType Basic                                                            #Basic认证方式

AuthName "www.fooher.com website Dept"                 #认证显示信息,提示信息

AuthUserFile /webdept/svn/passwd                             #用户密码文件

AuthzSVNAccessFile  /webdept/svn/authz                 #访问控制权限文件

Require valid-user                                                    #要求正式用户,不能匿名

</Location>

创建用户passwd文件

[root@Node63 ~]# mkdir /webdept/svn

[root@Node63 ~]# htpasswd -c /webdept/svn/passwd webuser               //第一次用c,创建,第二次就不用

[root@Node63 ~]# htpasswd /webdept/svn/passwd userweb                   //不能用-c,否则会覆盖webuser

[root@Node63 ~]# htpasswd /webdept/svn/passwd userhh

[root@Node63 ~]# cat /webdept/svn/passwd

webuser:1jSjUd6sxbKPA

userweb:otYOxfBbuhBrg

userhh:nsjh6I/G/iUTg

创建权限authz文件

[root@Node63 ~]# vim /webdept/svn/authz                                            //创建权限控制文件

[groups]

all = webuser,userweb

[/]                                                     #“/”表示所有仓库的跟目录下

webuser = rw

[www.fooher.com:/]                       #第一个仓库,webuser和userweb可以读写

@all = rw

[www.fuowa.com:/]                      #第二个仓库目录,userweb和userhh可以读写

userweb = rw

userhh = rw

***************************************************************************************************************

webuser用户可以读取 www.fooher.com,userhh 不可读取

userweb可以读取 www.fuowa.com,webuser 不可以

启动服务测试

[root@Node63 ~]# service httpd restart

访问http://192.168.1.63/webdept/www.fooher.com         webuser 和 userweb 可以读取,userhh 不可以

使用webuser和userweb用户效果

使用userhh登陆

访问http://192.168.1.63/webdept/www.fuowa.com   userweb 和 userhh 可以,webuser 不可以

使用userweb和userhh测试(没用内容,登陆即可)

补充:登陆欢迎信息

测试结果:

使用webuser测试结果(这里可以访问的原因是我们设置了/对于webuser是rw的权限

Linux客户端下操作

上传:

[root@Node63 ~]# svn import /website/ svn://192.168.1.63/www.fooher.com -m "首次使用import"

取回

[root@Node63 ~]# svn checkout svn://192.168.1.63/www.fooher.com source

[root@Node63 ~]# svn co "http://192.168.1.63/webdept/www.fooher.com" source  //http协议

修改数据后的操作

[root@Node63 source]# svn add 100.thml

[root@Node63 source]# svn delete 2.html

[root@Node63 source]# svn status

[root@Node63 source]# svn commit -m "操作之后,添加,删除,一定要提交"

[root@Node63 source]# chmod -R 777 /webdept/                      //若是报错,修改权限

Windows客户端下操作

Windows下使用TortoiseSVN工具来配置,官方网站:http://tortoisesvn.net/downloads.html

选择适应版本,32位或者64位

软件安装配置

从官方下载,直接安装,然后建立本地的源码存储目录,自己新建,如这里我们建立SVN这个目录,然后进入这个目录,右键:

配置:

输入用户名和密码:

新建代码上传

在SVN目录右键这个源码文件

然后再次右键这个文件,选择SVN Commit

输入注释,OK

接下来点击OK即可,有可能需要一个有写入权限的用户,需要注意

较好的SVN服务器构建建议

  • 所有的项目放在一个版本库中
  • 每个项目创建自己的目录,其下各自创建trunk,branches和tags三个目录
  • trunk目录存放开发主线
  • branches目录存放分支拷贝
  • tags目录存放标签拷贝
  • 开发和bug修正均每日提交到主干上
  • 将测试的版本拷贝到测试分支。如/branches/1.0
  • 并行工作,测试组对测试分支进行测试,开发组在主干上继续工作
  • 如果一个bug在任何一个位置被发现,错误在主干上修正,然合并到分支上
  • 测试结束,/branches/1.0拷贝到/tags/1.0.0,发布给客户
  • 发布后的bug修正继续提交到主干上,并从主干合并到/branches/1.0
  • 当积累了足够的bug修正,拷贝/branches/1.0到/tags/1.0.1,发布版本1.0.1
  • 主干的2.0开发完成,一个新的2.0分支被创建,测试、打标签和最终发布
  • 经过许多年,版本库结束了许多版本发布,进入了“维护”模式,许多标签代表了最终的发布版本
  • 使用分支进行特性开发
  • 特性开发是使用分支进行组件独立开发,最终合并的方式
  • 开发周期一般为折衷模式。如果工作独立性较强,修改量较大,应该使用特性分支
  • 应每周一次从主干合并更新到分支,以防止与主干差异性过大

SVN根目录的访问

SVNParentPath是支持多库类型,访问只能跟版本库的绝对路径,如:http://ip/svn/svn1

如果希望只想单一库,那么配置如下

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

<Location /webdept>

DAV svn

SVNPath /webdept/www.fooher.com

AuthType Basic

AuthName "Authorization Realm"

AuthUserFile /webdept/svn/passwd

AuthzSVNAccessFile /webdept/svn/authz

Require valid-user

</Location>

http://192.168.1.63/webdept                    输入webuser

但是另外一个版本库就无用了!

SVN旧版本文件

本地库右键:TortoiseSVN-Update to revision

确定

就查看了旧版本的文件

 

评论已关闭