Svn(subversion)是近年来崛起的非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个跨平台的开源的版本控制系统。Svn版本管理工具管理着随时间改变的各种数据。这些数据放置在一个中央资料档案库(repository)中,这个档案库很像一个普通的文件服务器或者FTP服务器,但是,与其他服务器不同的是,SVN会备份并记录每个文件每一次的修改更新变动。这样我们就可以把任意一个时间点的档案恢复到想要的某一个旧的版本,当然也可以直接浏览指定文件的更新历史记录。
为什么会有svn这样一个项目?
官方解释:为了接管CVS的用户基础,确切的说,我们写了一个新的版本控制系统,它和CVS很相似,但是它修正了以前CVS所没有解决的许多问题。问题见SVN官方首页。
SVN是一个非常通用的软件系统,它常被用来管理程序源码,但是它也可以管理任何类型的文件,如文本,视频,图片等等。
Git 个人代码版本管理工具
Svn集中代码版本管理工具
svn版本控制系统是集中式的数据管理,存在一个中央版本库,所有开发人员本地开发所使用的代码都是来自于这个版本库,提交代码也都必须提交到这个中央版本库。
svn版本控制系统工作流程如下:
在中央库上创建或从主干复制一个分支
从中央库check out 下这个分支的代码
增加自己的代码文件,修改现存的代码或删除代码文件
commit代码,假设有人在刚刚的分支上提交了代码,你就会被提示代码过期,你得先up你的代码后再提交。up代码的时候如果出现冲突,需要解决好冲突后再进行提交。
缺点:
当无法连接到中央版本库的环境下,你无法提交代码,将代码加入版本控制;
你无法查看代码的历史版本以及版本的变化过程。提交到版本控制系统中的代码我们都默认通过自测可运行的,如果某个模块的代码比较复杂,不能短时间内实现为可测试的功能,那么你需要等很长的时间才能提交自己的代码,由于代码库集中管理,因此,需要对中央版本库的存储做备份。这点分布式的版本控制系统要好一些。Svn的备份要备份所有代码数据以及所有更改的版本记录。
git是由Linus开发的,所以很自然的git和Linux文件系统结合的比较紧密,以至于在windows上你必须使用cygwin才能使其完美的工作。
那git凭啥叫做分布式的版本控制系统呢?还是从其工作模式讲起把。
git中没有了中央版本库的说法了,但是为了开发小组的代码共享,我们通常还是会搭建一个远程的git仓库。
但是和svn不同的是,开发者本地也包含了一个完整的git仓库,从某种程度上说本地的仓库和远程的仓库在身份上是等价的,没有主从之分。
如果你的项目是闭源项目,或者你习惯于以往的集中式的管理模式的话,那么在git下你也可以像svn那样的工作,只是流程中可能会增加一些步骤。
你本地创建一个git库,并将其add到远程git库中。
你在本地添加或者删除文件,然后commit,当然commit操作都是提交到本地的git库中了。(嗯,其实是提交到git目录下的objects目录中去了)
将本地git库的分支push到远程git库的分支,如果这个时候远程git库中已经有别人push过,那么远程git库将不允许你push,这时候你需要先pull,然后如果有冲突,处理好冲突,commit到本地git库后,再push到远程git库。
从上面的描述我们可以看到,我们每个开发人员的本地都会有一个git库,我们可以随时进行commit而不需要联网,可以随时查看历史版本,当某一个功能点开发完了之后我们可以将commit后的内容push到远程git库了,如果远程git库的版本在你上次clone或者pull之后变化了,那么你需要进行pull并处理冲突,提交之后,再push到远程git库。
svn仍是当前企业的主流。git正在发展,也许未来也会成为主流,但现在还不是。如果同学们有精力,能同时掌握更好。
对于版本管理系统,运维人员需要掌握的技术点:
安装,部署,维护,排障。
简单使用,很多公司都是由开发来管理,包括建立新仓库和添加删除账号
对于版本控制系统,运维人员相当于开发商,开发人员是业主,运维搭建的系统为开发人员服务的。
SVN客户端可以通过多种方式访问服务器端,例如:本地磁盘访问,或各种各样不同的网络协议访问,但一个版本库地址永远都是一个URL,URL反映了访问方法。
访问方式 说明
file:// 直接通过本地磁盘或者网络磁盘访问版本库
http:// 通过WebDAV协议访问支持Subversion的Apache服务器
https:// 与http://相似,但是用SSL加密访问
svn:// 通过TCP/IP自定义协议访问svnserve服务器
svn+ssh:// 通过认证并加密的TCP/IP自定义协议访问svnserve服务器
svn存储版本数据有2种方式:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。
BDB:
伯克利DB(Berkeley DB),版本库可以使用的一种经过充分测试的后台数据库实现,不能在通过网络共享的文件系统上使用,伯克利DB是Subversion 1.2版本以前的缺省版本库格式
FSFS:
一个专用于Subversion版本库的文件系统后端,可以使用网络文件系统(例如 NFS 或 SMBFS)。是1.2版本及其后的缺省版本库格式。
开始新一天的工作:
首先从SVN服务器下载项目组最新代码。
进入自己的分支,进行开发工作,每隔一小时向服务器上自己的分支提交一次代码(很多程序员都有这个习惯。因为有时候自己对代码改来改去,最后又想还原到新一个小时的版本,或者看看前一个小时自己修改了哪些代码,就需要这样做了)。
下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。
优点:
管理方便,逻辑清晰明确,符合一般人思维习惯。
易于管理,集中式svn服务器更能保证数据安全性。
代码一致性非常高。
适合开发人数不多的项目开发。
普及度高,大部分软件配置管理的大学教材都是使用svn和vss。
#光盘安装svn
[root@localhost ~]# mount /dev/sr0 /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# yum -y install subversion
Loaded plugins: fastestmirror
Determining fastest mirrors
#建立svn版本库数据存储根目录(svndata)及用户,密码权限目录(svnpasswd)
mkdir -p /application/svndata #数据存储根目录
mkdir -p /application/svnpasswd #用户,密码权限目录
[root@localhost ~]# svnadmin create /application/svndata/yunjisuan
[root@localhost ~]# tree /application/svndata/yunjisuan/
/application/svndata/yunjisuan/
|-- README.txt
|-- conf
| |-- authz
| |-- passwd
| `-- svnserve.conf
|-- db
| |-- current
| |-- format
| |-- fs-type
| |-- fsfs.conf
| |-- min-unpacked-rev
| |-- rep-cache.db
| |-- revprops
| | `-- 0
| | `-- 0
| |-- revs
| | `-- 0
| | `-- 0
| |-- transactions
| |-- txn-current
| |-- txn-current-lock
| |-- txn-protorevs
| |-- uuid
| `-- write-lock
|-- format
|-- hooks #钩子脚本
| |-- post-commit.tmpl
| |-- post-lock.tmpl
| |-- post-revprop-change.tmpl
| |-- post-unlock.tmpl
| |-- pre-commit.tmpl
| |-- pre-lock.tmpl
| |-- pre-revprop-change.tmpl
| |-- pre-unlock.tmpl
| `-- start-commit.tmpl
`-- locks #代码锁,控制版本
|-- db-logs.lock
`-- db.lock
10 directories, 28 files
#提示:查看svnadmin命令帮助的方法
[root@localhost ~]# cd /application/svndata/yunjisuan/conf/
[root@localhost conf]# ll
total 12
-rw-r--r--. 1 root root 1080 Sep 13 16:02 authz
-rw-r--r--. 1 root root 309 Sep 13 16:02 passwd
-rw-r--r--. 1 root root 2279 Sep 13 16:02 svnserve.conf
[root@localhost conf]# cp svnserve.conf{,.bak}
[root@localhost conf]# vim svnserve.conf
#修改配置文件的如下信息
[root@localhost ~]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf.bak | sed -n '12p;13p;20p;27p'
12 # anon-access = read
13 # auth-access = write
20 # password-db = passwd
27 # authz-db = authz
#将配置文件代码修改为如下所示:
[root@localhost ~]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf | sed -n '12p;13p;20p;27p'
12 anon-access = none #禁止匿名访问
13 auth-access = write #验证访问可写
20 password-db = /application/svnpasswd/passwd #密码文件位置
27 authz-db = /application/svnpasswd/authz #验证文件位置
特别提示:
此配置文件里的每条配置代码必