1、版本控制管理工具SVN详解

1.1 什么是SVN(subversion)

   SVN是近年来非常优秀的版本管理工具,与CSV管理工具一样,SVN是一个跨平台开元版本控制系统,但是SVN与众不同的是,SVN会备份并记录每个文件每一次的修改更新变动。这样我们可以把任意一个时间点档案恢复到想要的某一个旧版本,当然也可以直接浏览指定文件的更新历史记录

SVN的相关站点:

http://subversion.tigris.org/

http://subversion.apache.org/

SVN客户端:http://tortoisesvn.net/

SVN中文网站:http://svndoc.iusesvn.com/

目前为止:常见的版本管理软件有:vss,CVS,SVN,git

1.1.1 SVN 与Git的区别 

SVN是一个集中式数据管理中心,存在一个中央版本库,所有开发人员所使用的代码都是来源于版本库,提交代码也是这个中央版本库。

SVN版本控制系统工作流程:

a,在中央库上创建或者从主干复制一个分支

b,从中央库check out下这个分支代码

c,增加自己的代码,修改,删除代码文件

d, commit 代码。假设有人刚刚在分支提交了代码,你就会被提醒代码过期

  你需要先update你的代码,然后在提交。 

1.1.2优缺点:

当无法连接到中央版本库的环境下,你无法提交代码,将代码加入版本控制。

你无法查看代码的历史版本以及版本的变化过程。提交到版本控制系统的代码我们都默认通过自测可运行。如果某个模块的代码比较复杂,不能短时间内实现可测试的功能,那么需要更长时间提交自己的代码,因此需要备份存储做备份。这点分布式的版本控制系统比较好点

SVN的备份要备份所有代码数据以及所有更改的新版本记录

1.1.3 Git分布式版本控制

git中没有了中央分布式,但是为了开发小组的代码共享,我们通常还是会搭建一个远程git仓库,从某种意义上说,本地的git和远程的git仓库没有主从之分.

a.如果你本地创建一个git库,并将其add到远程git库中

b,你在本地添加或者删除文件,然后commit,当然commit操作都是提交到本地的git库中了,(也就是提交到了本地git目录的object目录中去了)

c,将本地的git库的分支push到远程git库的分支,如果这时候远程git库中,以及分别有了别人的push,那么远程git的分支不允许你push,到这个时候需要先pull,然后如果有冲突处理好冲突,commit到本地git,在push到远程git库

1.1.4 运维需要掌握的技术点:

a,安装,部署,维护,排障 

b,简单应用,很多公司由开发来管理,包括建立新仓库,添加,删除账号

1.2 svn服务运行方式与访问方式

1.2.1 SVN服务端运行方式

SVN服务常见的运行访问方式有3种:

a,独立服务器访问

访问地址:SVN://svn.etiantian.org/sadoc

b,借助Apache等http服务

访问地址如: http://svn.etiantian.org/sadoc

b1,单独安装Apache+svn   不推荐,比较土

b2,csvn(apache+svn)是一个单独的整合软件,带web界面管理的SVN软件.

c,本地直接访问

访问方式file://application/svndata/sadoc  一般在SVN服务器本地使用

我们主要以第一种和第二种的CSVN web 管理方式 

1.2.1.1 SVN客户端访问方式

file://           直接本地磁盘或者网络磁盘访问版本库

http://           通过webDAV 协议访问subversion的Apache服务器

https://          与http://相似,但是用ssl加密访问

SVN://            通过头tcp/ip自定义协议访问SVNsever

svn+ssh           通过认证加密tcp/ip自动以协议访问SVNserver服务器,

 1.3 SVN档案库数据格式

SVN存储版本数据有2种方式:BDB(一种事务安全型表类型 berkley DB) ,FSFS(一种不需要数据库的存储系统)BDB方式在服务器中断时候,可能锁住数据,所以还是FSFS方式更安全

FSFS 一个专门用于subversion版本库的文件系统后端,可以使用网络文件 系统(NFS,SMBFS)

SVN是一个基于关系型数据库BDB或者一系列二进制文件的FSFS

1.3.1 SVN集中式版本管理系统

SVN是一种集中式文件系统版本管理系统,集中式管理的工作流程如下图

SVN版本控制_版本库

集中式代码管理的核心是svn服务器,所有开发者新来的第一天必须从服务器获取代码,然后开发,最后解决冲突,提交,所有信息都放在svn服务器上。

1.3.2 开发者利用svn版本管理系统工作过程 

举例说明:

a,从svn服务器下载项目最新代码。

b,进入自己的 分支,进行开发工作,每隔一段时间,提交一次,

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

1.3.2.1缺点:

a,由于每次提交都会有一个原始副本,因此svn数据库容量会暴增

b,如果不能连接到svn服务器上,基本上不可以工作

c,不适合开源系统开发,开发人数较多,但是集中式管理非常明确权限管理机制,可以分层次管理

1.3.2.2优点:

a,管理方便,逻辑清晰,明确。

b,易于管理,集中式svn服务器更容易保证数据安全性

c,代码一致性非常高

d,适合开发人数不多的项目开发

2安装配置svn服务

2.1准备操作系统并查看系统环境

[root@localhost ~]# cat /etc/redhat-release 

CentOS release 6.5 (Final)

[root@localhost ~]# uname -r

2.6.32-431.el6.x86_64

[root@localhost ~]# yum install subversion -y 

[root@localhost ~]# rpm -qa | grep subversion 

subversion-1.6.11-15.el6_7.x86_64

[root@localhost ~]# sed  -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf 

[root@localhost ~]# grep keepcache  /etc/yum.conf 

keepcache=1   rpm包安装后不清除

2.0.2配置并启动svn

建立svn版本数据存储根目录svndata,用户,密码,权限目录

[root@localhost ~]# mkdir -p /application/svndata/   --数据存储的根目录

[root@localhost ~]# mkdir -p /application/svnpasswd  --用户,密码权限目录

启动svn服务,指定svn服务的根目录

[root@localhost ~]# svnserve -d -r /application/svndata/ 

[root@localhost ~]# ps -ef | grep svn

root      1838     1  0 16:56 ?        00:00:00 svnserve -d -r /application/svndata/

2.0.3 建立项目版本库,并且配置版本库

创建一个新的subversion项目sadoc,类似的这样显目可以创建多个,并对于不同的代码、

[root@localhost ~]# svnadmin create /application/svndata/sadoc    -创建一个新的项目

2.0.4 修改,调整svn配置文件以及权限文件

配置允许用户wyb读写访问

cd  /application/svndata/sadoc/conf

[root@localhost conf]# cp svnserve.conf svnserve.conf.bak 

[root@localhost conf]# vim svnserve.conf

修改完之后如下

[root@localhost conf]# grep -Ev "^#|^$" svnserve.conf

[general]

anon-access = none

auth-access = write

password-db = /application/svnpasswd/passwd

authz-db =  /application/svnpasswd/authz

[sasl]

把密码认证文件模块复制到相关的目录,这样方便同意管理

[root@localhost conf]# ls /application/svnpasswd/

[root@localhost conf]# cp passwd  authz  /application/svnpasswd/

[root@localhost conf]# ls /application/svnpasswd/

authz  passwd

[root@localhost conf]# ll /application/svnpasswd/

total 8

-rw-r--r-- 1 root root 1080 Oct 22 17:19 authz

-rw-r--r-- 1 root root  309 Oct 22 17:19 passwd

[root@localhost conf]# chmod 700 /application/svnpasswd/*

[root@localhost conf]# ll /application/svnpasswd/

total 8

-rwx------ 1 root root 1080 Oct 22 17:19 authz

-rwx------ 1 root root  309 Oct 22 17:19 passwd

[root@localhost conf]

新增用户,密码

提示:

1,等号前为SVN账号,等好后为密码,密码是明晚,注意密码权限700

2,更改svnserve.conf时候,需要重启svn,更改authz,passwd文件时候不需要重启svn

[root@localhost svnpasswd]#vim passwd

[root@localhost svnpasswd]# cat passwd 

 

[users]

# harry = harryssecret

# sally = sallyssecret

wyb = 123456 

zhiyan = zhiyan 

[root@localhost svnpasswd]

[root@localhost svnpasswd]# vim authz   权限配置文件

格式说明

版本库目录格式:

[<版本库>:/项目/目录]

@<用户组名>=<权限>

<用户名>=<权限>

[/] 表示根目录。根目录就是svnserver启动时候,我们制定的/application/svndata [/]就表示对全部版本库设置权限

[repos:/]   表示对版本库repository设置权限

[repos:/sadoc] 表示对版本库repo中sadoc项目设置权限

[repos:/sadoc/wyb] 表示对版本库repos中的sadoc项目的wyb目录设置权限

权限主体可以是用户组,用户,* ,用户组前面加@,*表示全部用户

权限可以是w ,r,wr和 空表示没有任何权限

authz 中每个参数都要定格写,开头不能有空格

对于组,要以开头@开头,用户不需要@开头

[root@localhost svnpasswd]#cat authz 

新增部分

sagroup = wyb,zhiyan

[sadoc:/]

wyb = rw

zhiyan = r

@sagroup = r

 

注意:

* 权限配置文件中出现的用户名必须是用户配置文件中定义

* 对权限配置文件的修改立即生效,不必重启svn

用户格式

[groups]

其中,1个用户组可以包含1个或者多个用户,用户可以逗号分隔。

此时svn安装完毕

3.1  windows客户端软件tortoisesSVN

下载地址:http://tortoisesvn.net/downloads.html

由于目前安装的是svn独立访问方式,所以svn客户端链接服务器的方式如下

svn://192.168.2.48/sadoc

用户名:gongli

密码:123456

3.1.2 linux客户端命令行使用说明

co  checkout

up  update

ci  commit

3.1.2.1 从svn库提取数据

a, 将文件checkout到本地目录   Linux客户端,是checkout ,而不是update

[root@localhost sadoc]# mkdir /svndata

/svndata   ---项目代码下载到、/svndata/ 下 

svn co  svn://192.168.2.48/sadoc/  /svndata/  --username=gongli  --password=123456

3.1.2.2-查看服务器端的数据

[root@localhost svndata]# svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  -查看服务器端的数据

svn.txt

ww.txt

新建文本文档.txt

[root@localhost svndata]

[root@localhost svndata]# svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  --verbose

5 wyb                   Oct 23 10:59 ./

1 wyb              8011 Oct 23 09:49 svn.txt

4 wyb                 0 Oct 23 10:37 ww.txt

5 wyb                 0 Oct 23 10:59 新建文本文档.txt

3.1.2.3 从本地提交到svn服务器

[root@localhost svndata]# touch a.html 

[root@localhost svndata]# svn add  a.html 

A         a.html

[root@localhost svndata]# svn commit 

svn: Commit failed (details follow):

svn: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the 

--message (-m) or --file (-F) options

svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no 'editor-cmd' run-time configuration 

option was found

[root@localhost svndata]# svn commit  -m "svn ci data" 

Adding         a.html

Transmitting file data .

Committed revision 6.

[root@localhost svndata]

[root@localhost svndata]# svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  --verbose

6 wyb                   Oct 23 11:09 ./

6 wyb                 0 Oct 23 11:09 a.html

1 wyb              8011 Oct 23 09:49 svn.txt

4 wyb                 0 Oct 23 10:37 ww.txt

5 wyb                 0 Oct 23 10:59 新建文本文档.txt