版本管理工具之SVN(Subversion)

一、SVN介绍及原理说明

1.1 SVN介绍
  SVN(Subversion)是Apache软件基金会组织下的一个项目,是一个跨平台的开源的源代码管理工具.是cvs的接班人.Subversion类似一个文件服务器,数据放置在一个中央资料档案库(repository)中;但是可以记录每个文件的每一次修改更新记录,这样就可以回退到到任意时刻的旧的版本,可以用来管理程序源码、其他文件类型(文本、视频、图片等)

官方网站:
  官方:http://subversion.apache.org/
  svn官方手册:http://svnbook.red-bean.com/
  svn客户端:https://tortoisesvn.net/svn客户端 手册:https://tortoisesvn.net/downloads.html
  svn源码下载地址:http://archive.apache.org/dist/subversion/

1.2.SVN版本控制的功能:

  1.备份--编写的代码上传到服务器保存
  2.代码还原--对于本地代码遗失可以从服务器中checkout下来
  3.协同修改--对于有冲突的代码可以商量
  4.多版本项目文件管理--文件统一管理
  5.追溯问题代码的编辑人和编辑时间(更好的解决问题,)
  6.权限控制--不同的开发人员对代码的读写权限不一致、

官方解释:
  为了接管CVS的用户基础,确切的说,我们写了一个新的版本控制系统,它和CVS很相似,但它修正了以前CVS所没有解决的许多问题,可以见SVN官方首页介绍。
  SVN常被用来管理程序源代码,但是它也可以管理任何类型的文件,如文本、视频、图片等
截止当到,常见的版本管理软件有:VSS、CVS、SVN、GIT
补充说明:

  1.微软是vss
  2.开源的项目是SVN和git
SVN是一个集中的版本管理,每一次的版本管理都是在服务器端
git是一个分布式版本管理,可以在本地实现版本管理,当连接不上git服务器时,开发人员还是可以将代码发布出去.

1.3.SVN服务器运行方式(3种):

 1.独立服务器(例:svn://x.x.x.x/xxx)
 2.借助apahce的CSVN(apache+svn)(例:http://x.x.x.x/xxx)
单独的整合web界面管理的SVN软件软件
 3.本地直接访问(例:file://x.x.x.x/xxx)

1.4.SVN的访问方式说明:
  SVN客户端可以通过多种方式访问服务端,如:本地磁盘访问,或各种各样不同的网络协议访问,但一个版本库地址永远都是一个URL。(URL反映了访问方法)

  file:// 直接访问本地磁盘或网络磁盘访问版本库
  http:// 通过webdav协议访问支持subversion的apache服务器
  https:// 与http://类似,只是用了ssl加密访问
  svn:// 通过TCP/IP自定义协议访问subversion服务器
  svn+ssh:// 通过认证并加密的TCP/IP自定义协议访问subversion服务器

1.5.SVN服务器存储版本方式(2种):
  SVN之所以能做版本管理,是因为他有数据库。
  SVN是基于关系型数据库的(BerkleyDB)或一系列二进制文件的(FS_FS)。一方面这解决了许多问题(如,并行读写共享文件)以及添加了许多新功能(例如运行时的事务特性)。然而另一方面,数据存储由此变得不透明,不能像ftp、samba、nfs等能看到实体文件。

  1.BDB(一种事务安全型表类型)BDB方式在服务器中断时,有可能锁住数据。
  2.FSFS(默认的FSFS,一种不需要数据库的存储系统;FSFS方式相对安全一些)
(1)BDB
  伯克利DB,版本库可以使用的一种经过充分测试的后台数据库实现,不能在通过网络共享的文件系统上使用,是subversion1.2版本以前的默认版本库格式。
(2)FSFS
  一个专用于subversion版本的文件系统后端,可以使用网络文件系统(如NFS或SMBFS)。是1.2版本及其后的默认版本格式。

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

SVN版本系统逻辑架构原理图

svn代码管理流程

1.7.SVN的特性
#SVN的优点

  1)管理文件,逻辑清晰明确,符合一般人思维习惯
  2)易于管理,集中式SVN服务器更能保证数据安全性
  3)代码一致性非常高
  4)适合开发人数不多的项目开发
  5)普及度高,大部分软件配置管理的大学教材都是使用SVN和VSS

#SVN的缺点

  不适合开发人员过多的场合,开发人员多了,会有代码合并的。

二、部署SVN服务器(独立)

2.1 环境说明

Server: CentOS-6.7-x86_64
Server IP: 172.18.11.212
Client: Win7 x86_64

2.2 准备部署环境

Server端:
Subversion官网:http://subversion.apache.org/
1.9.3版本下载:http://apache.fayea.com/subversion/subversion-1.9.3.tar.bz2
Client端:
TortoiseSVN官网:http://tortoisesvn.tigris.org/
1.9.3 x86_64位置版本下载:http://netix.dl.sourceforge.net/project/tortoisesvn/1.9.3/Application/TortoiseSVN-1.9.3.27038-x64-svn-1.9.3.msi
中文语言包(版本必须匹配,否则语言包不生效,客户端设置中找不到):
http://pilotfiber.dl.sourceforge.net/project/tortoisesvn/1.9.3/Language%20Packs/LanguagePack_1.9.3.27038-x64-zh_CN.msi

2.3 安装SVN

#检查系统是否安装svn
  方法1:rpm -qa|grep subversion #查看subversion安装包
  方法2:ll/usr/bin/svn* #查看/usr/bin目录是否有svn的二进制命令
  方法3:svnserve -version #如果有执行文件,查看版本。

2.4 依赖问题
yum install autoconf libtool gcc gcc-c++ -y
补充说明:
#openssl(optional)
openssl主要在客户机上通过serf使用或者apache服务器使用
检测: find / -name opensshlv.h 如果找不到可以进行yum安装或者源码安装(略)
yum install openssl openssl-devel -y
安装好之后找到opensslv.h的所在目录,编译svn时使用”-with-openssl=”带上路径。
#zlib(必需)
zlib主要作用用作SVN的二进制差异算法,算法取决于zlib压缩。
如果找不到可以进行yum安装或源码安装(http://zlib.net/)也可通过svn解压后的脚本获得
yum install zlib zlib-devel -y
2.5 安装SVN
#解压
将下载的subversion-1.9.3.tar.bz2放置于/usr/local/src目录

cd /usr/local/src
tar -jxvf subversion-1.9.3.tar.bz2
cd subversion-1.9.3

#配套依赖包
在subversion-1.9.3目录内有1个可执行get-deps.sh 可以下载版本相关的依赖包
./get-deps.sh
#执行之后subversion-1.9.3 文件夹多出了 apr, apr-util, zlib, serf (与客户通过apache服务访问svn相关)
sqlite-amalgamation等文件夹,其中apr,apr-util,zlib是subversion必需依赖包,系统中可能已安装,但版本可能不匹配(尤其是apr,apr-util,所以使用此脚本下载的依赖包最佳)
apr/apr-util

cd apr
./configure --prefix=/usr/local/apr
make
make install
cd ../apr-util
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install

编译安装

cd ..
./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --without-berkeley-db
make
make install
#不使用bdb方式,预编译时可能会有告警

环境变量
将svn的命令目录加入环境变量。

vim /etc/profile
export PATH=/usr/local/svn/bin:$PATH
source /etc/profile

或者采用软链接的方式将svn的命令加入到环境变量中,如下
ln -s /usr/local/svn/bin/* /usr/bin/
验证
svnserve --version
#返回版本信息即成功
2.6 部署SVN
#创建版本库
mkdir -p /svn
#创建仓库根目录

mkdir -p /svn/svntest
svnadmin create /svn/svntest

#创建版本库svntest,如果有多个项目可建多个版本库
版本配置库文件
cd /svn/svntest/conf/
#版本库svntest的配置文件目录
vim svnserve.conf

19 anon-access = none  #必须设置,否则所有用户不用密码就可以访问
20 auth-access = write
27 password-db = passwd
36 authz-db = authz
47 realm = svntest

#取消general项目下如上几行的注释t
#27/36/47行可以使用如上的相对路径(passwd/authz默认为版本库conf下文件,svntest为版本库svntest根目录),也可以指定绝对路径
#注意:每一行的都要顶头,不能有空格,否则报错。
用户配置文件

cd /svn/svntest/conf/
vim passwd
[users]
# harry = harryssecret
# sally = sallyssecret
testuser = testsecret

#设置登录账号与密码
#对用户配置文件的修改立即生效,不需要重启服务
权限配置文件
cd /svn/svntest/conf/
做如下修改,其余默认配置可不变

vim authz
[groups]
admin = testuser
[svntest:/]
@admin = rw
#设置admin组,用户testuser加入admin组,1个用户组可含多个用户,用逗号隔离
#设置admin组对版本库svntest根目录及以下有读写权限,也可以针对单个用户设置,如 testuser = rw
#权限配置文件中的账户必须已在用户配置文件中定义,对权限配置文件的修改立即生效,不需要重启svn服务

authz文件语法
用户组格式

[groups]
= ,
其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔

版本库目录格式

[<版本库>:/项目/目录]
@<用户组名> = <权限>
<用户名> = <权限>

其中,方框号内部分可以有多种写法:

[/],表示根目录及以下,根目录在svnserve启动时指定的,[/]表示对仓库根目录有设置权限;
[版本库:/] 表示对版本库xxx设置权限,如上文指定的svntest版本库;
[版本库:/项目] 表示对版本库xxx中的某项目设置权限;
[版本库:/项目/目录] 表示对版本库xxx中的某项目的某目录设置权限;
权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户;
权限可以是w、r、wr和空,空表示没有任何权限

启动svn
svnserve -d --listen-port 5690 -r /svn/

# -d表示以daemon方式运行
# --listen-port指定监控端口,不指定时默认是3690端口,通过端口可开启多个svn库
# -r指定仓库根目录,注意不是某版本库根目录,根目录的设置与客户端登录地址有莫大的关系,如果设置不当,可能会导致登录的诸多问题

#验证
ps aux | grep svn
#停止svn
killall svnserve
开机启动svn

vim /etc/rc.d/init.d/svn
#!/bin/bash
# chkconfig: - 85 15
# description: svn server
SVN_HOME=/svn
  if [ ! -f "/usr/local/svn/bin/svnserve" ]
   then
     echo "svnserver startup: cannot start"
  exit
fi
  case "$1" in
start)
  echo "Starting svnserve…"
   /usr/local/svn/bin/svnserve -d --listen-port 5690 -r $SVN_HOME
  echo "Finished!"
;;
stop)
  echo "Stoping svnserve…"
  killall svnserve
  echo "Finished!"
;;
restart)
  $0 stop
  $0 start
;;
*)
  echo "Usage: svn { start | stop | restart } "
  exit 1
esac

#注意修改shell中的相关设置,如变量SVN_HOME,端口等
#请不要删除# chkconfig: – 85 15与# description: svn server,否则无法使用chkconfig加入服务,会提示service svn does not support chkconfig

chmod 755 /etc/rc.d/init.d/svn
[root@localhost conf]# chkconfig --add svn
[root@localhost conf]# chkconfig --level 35 svn on
#赋予启动脚本权限

也可以简单处置,如编辑rc.local文件

vim /etc/rc.d/rc.local
/usr/local/svn/bin/svnserve -d –listen-port 5690 -r /svn
iptables
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5690 -j ACCEPT
/etc/rc.d/init.d/iptables save
#打开相应的端口,请千万保存iptables设置

3.6 svnserve –help参数说明
有效选项:

-d [--daemon] : 后台模式
-i [--inetd] : inetd 模式
-t [--tunnel] : 隧道模式
-X [--listen-once] : 监听一次方式(调试用)
-r [--root] ARG : 指定服务的根目录
-R [--read-only] : 强制只读;覆盖版本库配置文件
--config-file ARG : 从文件 ARG 读取配置
--listen-port ARG : 监听端口
[方式: daemon, listen-once]
--listen-host ARG : 监听主机名称或IP地址
[方式: daemon, listen-once]
-T [--threads] : 使用线程代替进程 [方式: daemon]
--foreground : 在前台运行(调试用)
[方式: daemon]
--log-file ARG : svnserve 日志文件
--pid-file ARG : 写进程 PID 到文件 ARG
[方式: daemon, listen-once]
--tunnel-user ARG : 隧道用户名(默认是当前UID对应的用户名)
[方式: tunnel]
-h [--help] : 显示本帮助
--version : 显示程序版本信息

三、客户端TortoiseSVN

3.1windows 端SVN的管理
安装TortoiseSVN客户端及语言包,访问路径svn://ip:port
以下是简单的使用教程
3.1.1 数据导入
选择本地需要导入到服务器端的文件目录,,右键—>TortoiseSVN导入,如下:

#输入版本库地址

#首次使用需要输入用户名/密码

3.1.2 数据检出
选择需要检出的目录,鼠标右键,SVN检出 –>导出

填写导出版本库URL与需要导出的目录

3.1.3 数据检出

如果版本有更新,选择相应的目录,右键-->SVN更新;
如果本地做了更改,需要上传到服务器,选择相应的目录,右键-->SVN提交。
建议每次本地要做更新提交时,先SVN更新到服务器端最新版本,在最新版本上做本地修改再提交。


3.1.4 添加文件/目录
如果在检出目录内新增了文件/目录,需要先添加,再SVN提交到版本库,如下

如添加的文件符号变更如下,然后才能SVN提交到版本库。
3.1.5 删除文件/目录
如果需要删除服务器端文件/目录,不能使用本地删除,对删除的文件/目录,右键–>TortoiseSVN–>删除,回到上级目录,SVN提交。

3.2 linux下客户端管理
3.2.1 SVN管理命令用法
用法:
svn [options][args]
可用的子命令:(括号内是子命令的简写)

add
blame(praise,annotate,ann)
cat
checkout(co)  #从源码库取出一个工作版本的拷贝
cleanup
commit(ci)  #提交当前工作拷贝的更改,这个地方是有可能出现代码冲突的。
copy(cp)  #做一个工作拷贝的拷贝。
delete(del,remove,rm)  #删除本地或者svn server reponse 上的文件或目录。
diff(di)  #比较某个文件与库中的对应文件的不同,类似系统的diff命令,参数:文件名
export  #导出一个无版本控制的目录树拷贝,一般用于导出发行,或者投入运行的版本。
import  #将当前目录下的文件导入到svn response中。
info  #当前目录工作拷贝中某文件信息,如URL,版本,修改日期等,参数:文件
merge  #将两个来源之间的差异应用至拷贝路径。
mkdir  #在本地或者svn respon上新建一个文件夹,参数:URL或者路径
move(mv,rename,ren)  #这个命令移动文件或目录到你的工作拷贝或者是版本库
propdel(pdel,pd)  #
propedit(pedit,pe)  #
propget(pget,pg)
proplist(plist,pl) #
propset(pset,ps)  #
resolved  #
revert  #
status(stat,st)   #svn工作开呗当前状态,与svn server上的源码比较的结果。
switch(sw)
unlock
update(up)  #将svn server端文件同步到本地

3.2.2 实例应用
#将文件checkout到本地目录
svn checkout (co) remotepath localpath
例:

svn co svn://172.18.11.212/svntest/ //data/ --username=testuser --password=testsecret
svn checkout svn://172.18.11.212/svntest/ //data/ --username=testuser --password=testsecret

#查看SVN中的数据
查看版本库下的内容
svn list file:///svn/svntest
例:

svn list file:///svn/svntest
branch/
tag/

#服务器本地使用(不用密码,直接读库)

svn list file:///svn/svntest
st.txt

#远端登录

svn list svn://172.18.11.212/svntest/ --username=testuser --password=testsecret
st.txt

#提交数据

svn checkin(ci) -m "oldboy data" #无密码方式提交
svn ci /svn/ --username=testuser --password=testsecret -m "oldboy data"

发表评论

发表评论

*

沙发空缺中,还不快抢~