资源描述
使用SVN进行版本管理
使用SVN进行版本管理
银禾通信软件部
1. 简介...........................................................................................................................3
1.1. Subversion是什么?..............................................................................................................3
1.2 Subversion的特性.....................................................................................................................3
1.3 Subversion的架构.....................................................................................................................4
1.4安装Subversion........................................................................................................................5
1.4.1下载文件和安装.................................................................................................................5
1.4.2部署存储库并运行服务端.................................................................................................5
1.4.3创建项目以及配置访问权限.............................................................................................5
2. 基本概念....................................................................................................................8
2.1 版本库....................................................................................................................................8
2.2文件共享的问题........................................................................................................................8
2.3锁定-修改-解锁 方案...............................................................................................................9
2.4拷贝-修改-合并 方案...............................................................................................................10
3. 版本管理...................................................................................................................12
3.1软件配置...................................................................................................................................12
3.1.1忽略文件............................................................................................................................12
3.1.2合并比较工具....................................................................................................................13
3.2项目基本流程...........................................................................................................................14
3.3代码的版本管理.......................................................................................................................14
3.3.1运行独立服务器................................................................................................................14
3.3.2初始化导入........................................................................................................................15
3.3.3仓库目录结构....................................................................................................................17
3.3.4基本客户端操作................................................................................................................18
3.4版本的回退...............................................................................................................................21
3.5分支与分支的合并...................................................................................................................22
3.5.1什么是分支?....................................................................................................................22
3.5.2分支合并............................................................................................................................23
参考文献: ...................................................................................................................25
1.简介
程序员编写程序的过程中,每个程序都会有很多不同的版本,这就需要程序员很好的管理代码,在需要的时间可以取出需要的版本,并且每个版本都有一个完整的说明。我们使用Sub Version(简称SVN)作为版本管理工具。但是版本控制的作用不仅在软件开发领域,任何需要管理频繁信息改变的地方都需要它,这就是Subversion发挥的舞台。
1.1. Subversion是什么?
Subversion是一个自由/开源版本控制系统,它管理文件和目录可以超越时间。一组文件存放在中心版本库,这个版本库很像一个普通的文件服务器,只是它可以记录每一次文件和目录的修改,这便使你可以取得数据以前的版本,从而可以检查所作的更改。从这个方面看,许多人把版本控制系统当作一种“时间机器”。
Subversion可以通过网络访问它的版本库,从而使用户可以在不同的电脑上使用。一定程度上可以说,允许用户在各自的地方修改同一份数据是促进协作。进展可能非常的迅速,并没有一个所有的改变都会取得效果的通道,由于所有的工作都有历史版本,你不必担心由于失去某个通道而影响质量,如果存在不正确的改变,只要取消改变。
1.2. Subversion的特性
1.2.1 版本化的目录
CVS只记录单个文件的历史,但是Subversion实现了一个可以跟踪目录树更改的“虚拟”版本化文件系统,文件和目录都是有版本的。
1.2.2 真实的版本历史
通过Subversion,你可以对文件或是目录进行增加、拷贝和改名操作,也可以新增一个具有干净历史的文件。
1.2.3 原子提交
一系列的改动,要么全部提交到版本库,要么一个也不提交,这样可以让用户构建一个所要提交修改的逻辑块,防止部分修改提交到版本库。
1.2.4 版本化的元数据
每一个文件或目录都有一套属性—键和它们的值,你可以建立并存储任何键/值对,属性也是随时间的流逝而纳入版本控制的,很像文件的内容。
1.2.5 可选的网络层
Subversion在版本库访问方面有一个抽象概念,利于人们去实现新的网络机制,Subversion可以作为一个扩展模块与Apache结合,这给了Subversion在稳定性和交互性方面很大的好处,可以直接使用服务器的特性—认证、授权和传输压缩等等。也有一个轻型的,单独运行的Subversion服务,这个服务使用自己的协议可以轻松的用SSH封装。
1.2.6. 一致的数据操作
Subversion表示文件是建立在二进制文件区别算法基础上的,对于文本(可读)和二进制(不可读)文件具备一致的操作方式,两种类型的文件都压缩存放在版本库中,区别信息是在网络上双向传递的。
1.2.7 有效率的分支和标签
分支与标签的代价不与工程的大小成比例,Subversion建立分支与标签时只是拷贝整个工程,使用了一种类似于硬链接的机制,因而这类操作通常只会花费很少并且相对固定的时间。
1.2.8 可修改性
Subversion没有历史负担,它由一系列良好的共享C库实现,具有定义良好的API,这使得Subversion非常容易维护,可以轻易的用其他语言操作。
1.3. Subversion的架构
一端是保存你所有纳入版本控制的数据的Subversion版本库,在另一端是你的Subvesion客户端程序,管理着所有纳入版本控制数据的本地影射(叫做“工作拷贝”),在这两极之间是各种各样的版本库访问(RA)层,一些使用电脑网络通过网络服务器访问版本库,一些则绕过网络服务器直接访问版本库。
1.4. 安装Subversion
1.4.1下载文件和安装
SVN服务器端下载地址:
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
选择里面最新的win32安装包,我选择的是svn-1.4.2-setup.exe,因为最新的1.4.3只有二进制包,没有安装包。
SVN客户端软件下载地址:
安装过程其实很简单,哪个先装都可以,设置好安装路径后一路Next到底。
我的安装路径为是 服务端:C:\Program Files\Subversion 客户端:C:\Program Files\TortoiseSVN
服务端安装好后软件会自动在系统的环境变量中增加相应的值,测试是安装完成可以在cmd命令行中输入“svn”或者“svnadmin”来测试能否运行。
1.4.2 部署存储库并运行服务端
建立SVN的存储库,路径以D:\SVNRepo为例,创建完该文件后,就进行Windows的服务绑定,以便以后每次重启机器后都能自动运行,这里用到的是Windows自带的创建服务的命令sc,在命令行模式下执行:
sc create SVNService binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service -r D:\SVNRepo" displayname= "SVNService" depend= Tcpip start= auto
注意这里的格式,“=”后面是必须空一格的,否则会出现错误。其中的几个路径分别是服务端安装路径和存储库的路径。
在提示建立成功后,可以直接输入“net start SVNService”来启动服务,或者可以直接在“管理工具”的“服务”中直接启动。
1.4.3创建项目以及配置访问权限
进到E:\SVNRepo目录下,新建一个仓库文件夹repository,然后新建一个initproject文件夹来放最初工程,最后新建wc1文件夹,如果多个人使用,可以建多个.进到E:\SVNRepo\repository目录下,鼠标右键选择[TotoiseSVN]->[Create Repository href...]进行创建,创建之前保证该目录下没有任何的文件夹和文件。
创建成功后会在里面自动生成几个文件夹:dav目录是提供给Apache与mod_dav_svn使用的目录,让它们存储内部数据;db目录就是所有版本控制的数据文件;hooks目录放置hook脚本文件的目录;locks用来放置Subversion文件库锁定数据的目录,用来追踪存取文件库的客户端;format文件是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号;conf存放的是配置文件;
访问权限的设置方法:
在conf目录下,用记事本打开svnserve.conf,设置如下:
[general]
anon-access = none
autn-access = write
password-db = passwd
第一个用来设置匿名用户的权限 none为设置存储库不允许匿名访问;第二个用来设置经过授权的用户的权限 write为可以写入;第三个用来指定授权用户的密码存放文件
在同一目录下打开passwd,也就是上面设置的,当然你也可以改成其他的文件名,设置如下:
[users]
user1 = pass1
这里就是指定授权访问用户名和密码,格式为:用户名 = 密码
多个用户就写多行,设置完之后就大功告成了。
接下去就可以开始使用TotoiseSVN进行Import、Update、Checkout、Commit等操作了。
2. 基本概念
2.1. 版本库
Subversion是一种集中的分享信息的系统,它的核心是版本库,它储存所有的数据,版本库按照文件树形式储存数据—包括文件和目录。任意数量的客户端可以连接到版本库,读写这些文件。通过写,别人可以看到这些信息,通过读数据,可以看到别人的修改.
所以为什么这很有趣呢?讲了这么多,让人感觉这是一种普通的文件服务器,但实际上,版本库是另一种文件服务器,而不是你常见的那一种。最特别的是Subversion会记录每一次的更改,不仅针对文件也包括目录本身,包括增加、删除和重新组织文件和目录。
当一个客户端从版本库读取数据时,通常只会看到最新的版本,但是客户端也可以去看以前的任何一个版本。举个例子,一个客户端可以发出这样的历史问题“上个星期三的目录是怎样的?”或是“谁最后一个更改了这个文件,更改了什么?”,这些是每一种版本控制系统的核心问题:系统是设计来记录和跟踪每一次改动的。
2.2. 文件共享的问题
所有的版本控制系统都需要解决这样一个基础问题:怎样让系统允许用户共享信息,而不会让他们因意外而互相干扰?版本库里意外覆盖别人的更改非常的容易。
考虑下图 “需要避免的问题”的情景,我们有两个共同工作者,Harry和Sally,他们想同时编辑版本库里的同一个文件,如果首先Harry保存它的修改,过了一会,Sally可能凑巧用自己的版本覆盖了这些文件,Harry的更改不会永远消失(因为系统记录了每次修改),Harry所有的修改不会出现在Sally的文件中,所以Harry的工作还是丢失了—至少是从最新的版本中丢失了—而且是意外的,这就是我们要明确避免的情况!
2.3. 锁定-修改-解锁 方案
许多版本控制系统使用锁定-修改-解锁这种机制解决这种问题,在这样的系统里,在一个时间段里版本库的一个文件只允许被一个人修改。首先在修改之前,Harry要“锁定”住这个文件,锁定很像是从图书馆借一本书,如果Harry锁住这个文件,Sally不能做任何修改,如果Sally想请求得到一个锁,版本库会拒绝这个请求。在Harry结束编辑并且放开这个锁之前,她只可以阅读文件。Harry解锁后,就要换班了,Sally得到自己的轮换位置,锁定并且开始编辑这个文件。下图 “锁定-修改-解锁 方案”描述了这样的解决方案。
锁定-修改-解锁模型有一点问题就是限制太多,经常会成为用户的障碍:
· 锁定可能导致管理问题。有时候Harry会锁住文件然后忘了此事,这就是说Sally一直等待解锁来编辑这些文件,她在这里僵住了。然后Harry去旅行了,现在Sally只好去找管理员放开锁,这种情况会导致不必要的耽搁和时间浪费。
· 锁定可能导致不必要的线性化开发。如果Harry编辑一个文件的开始,Sally想编辑同一个文件的结尾,这种修改不会冲突,设想修改可以正确的合并到一起,他们可以轻松的并行工作而没有太多的坏处,没有必要让他们轮流工作。
· 锁定可能导致错误的安全状态。假设Harry锁定和编辑一个文件A,同时Sally锁定并编辑文件B,如果A和B互相依赖,这种变化是必须同时作的,这样A和B不能正确的工作了,锁定机制对防止此类问题将无能为力—从而产生了一种处于安全状态的假相。很容易想象Harry和Sally都以为自己锁住了文件,而且从一个安全,孤立的情况开始工作,因而没有尽早发现他们不匹配的修改。
2.4.拷贝-修改-合并 方案
Subversion,CVS和一些版本控制系统使用拷贝-修改-合并模型,在这种模型里,每一个客户联系项目版本库建立一个个人工作拷贝—版本库中文件和目录的本地映射。用户并行工作,修改各自的工作拷贝,最终,各个私有的拷贝合并在一起,成为最终的版本,这种系统通常可以辅助合并操作,但是最终要靠人工去确定正误。
这是一个例子,Harry和Sally为同一个项目各自建立了一个工作拷贝,工作是并行的,修改了同一个文件A,Sally首先保存修改到版本库,当Harry想去提交修改的时候,版本库提示文件A已经过期,换句话说,A在他上次更新之后已经更改了,所以当他通过客户端请求合并版本库和他的工作拷贝之后,碰巧Sally的修改和他的不冲突,所以一旦他把所有的修改集成到一起,他可以将工作拷贝保存到版本库,图 “拷贝-修改-合并 方案”和图 “拷贝-修改-合并 方案(续)”展示了这一过程。
拷贝-修改-合并 方案
拷贝-修改-合并 方案(续)
但是如果Sally和Harry的修改交迭了该怎么办?这种情况叫做冲突,这通常不是个大问题,当Harry告诉他的客户端去合并版本库的最新修改到自己的工作拷贝时,他的文件A就会处于冲突状态:他可以看到一对冲突的修改集,并手工的选择保留一组修改。需要注意的是软件不能自动的解决冲突,只有人可以理解并作出智能的选择,一旦Harry手工的解决了冲突—也许需要与Sally讨论—它可以安全的把合并的文件保存到版本库。
拷贝-修改-合并模型感觉是有一点混乱,但在实践中,通常运行的很平稳,用户可以并行的工作,不必等待别人,当工作在同一个文件上时,也很少会有交迭发生,冲突并不频繁,处理冲突的时间远比等待解锁花费的时间少。
最后,一切都要归结到一条重要的因素:用户交流。当用户交流贫乏,语法和语义的冲突就会增加,没有系统可以强制用户完美的交流,没有系统可以检测语义上的冲突,所以没有任何证据能够承诺锁定系统可以防止冲突,实践中,锁定除了约束了生产力,并没有做什么事。
3.版本管理
我们使用Sub Version(简称SVN)作为版本管理工具。这里着重介绍SVN作为跨平台的多人协作使用方法。在多个程序员管理同一段代码的过程中,版本的管理显得尤为重要,使用SVN可以方便的进行分支、合并,记录下所有的版本。
3.1软件配置
3.1.1忽略文件
在SVN 的[Setting]的[General]中,设置需要忽略的文件以便忽略掉一些临时的、无用的文件,常被忽略的文件有*.opt *.ncb *.suo *.plg *.pch *.idb *.pdb *.scc *.obj Debug Release *.o *.bin *.out *.ilk *.aps debug release *.clw *.bak。每个程序员可以根据自己的需要进行修改忽略文件,上面只是使用VC++与Tornado编程时常用的一些忽略文件。
图 2.2
以上说的忽略文件是指全局的忽略文件。SVN还能在特定的目录中指定需要忽略的文件。忽略文件支持通配符。
3.1.2合并比较工具
在Merge Tool中可以选择用来合并的工具,强烈推荐用Araxis Merge。在[Setting]->[Diff]中填入"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe";在[Setting]->[Merge]的选项中,填入"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe" %theirs %mine %merged ;其中"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe"是指合并工具的路径,%theirs %mine %merged分别指..将要合并到主干的分支,主干,及合并后的结果。
3.2. 项目基本流程
一个项目会有多个人共同合作开发完成。基本流程是:
1.各开发成员建立自己的分支,并在此分支上开发;
2.各开发成员把分支合并到主干上并形成较为稳定的版本;
3.各个成员重新从主干上建立新的分支,在此分支上开发(即回到第一步)
4.循环往复,直到工程结束。
3.3.代码的版本管理
3.3.1运行独立服务器
在任意目录下运行:
svnserve -d -r E:\svndemo\repository 我们的服务器程序就已经启动了。
3.3.2.初始化导入
在code\trunk目录下创建一个hello.c文件
#include <stdio.h>
void main(){
printf("Hello World!\n");
}
来到我们想要导入的项目根目录,在这个例子里是E:\svndemo\initproject:
右键->TortoiseSVN->Import...
URL of repository输入“svn://localhost/”
输入用户名和密码
ok
完成之后目录没有任何变化,如果没有报错,数据就已经全部导入到了我们刚才定义的版本库中。
3.3.3.仓库目录结构
点击右键TortoiseSVN à Repo-browser可以查看SVN浏览器
在浏览器中输入svn://localhost/ ,SVN仓库的负责人规划好仓库的目录结构。推荐的目录结构如下图所示。
仓库的一级目录只有两个,分别为code和doc。其中,doc主要用来放置先期的文档,code主要用来放置工程的代码,也可以包含后期的文档。
仓库的二级目录只可以是branch与trunk两个目录,分别存放主干与分支。trunk目录下直接存放工程文件。branch目录下包括一些子目录分别对应各个分支。
3.3.4.基本客户端操作
取出版本库到一个工作拷贝:
来到任意空目录下,在本例中是D:\SVNRepo\wc1,点击右键->Checkout,在URL of repository中输入svn://localhost/trunk,这样我们就得到了一份工作拷贝。
从SVN仓库中取出代码时,一定不要把整个仓库取出来,而应该只取出trunk目录,或只取出branch下的某个分支目录,点OK.
在工作拷贝中作出修改并提交:
打开hello.c,作出修改,然后右键->Commit...,这样我们就把修改提交到了版本库,我们可以运行。
察看所作的修改:
Hello.c上右键->TortoiseSVN->Show Log,这样我们就可以看到我们对这个文件所有的提交。
在版本1上右键->Compare with working copy,我们可以比较工作拷贝的文件和版本1的区别。
3.4 版本的回退
在代码的编写过程中,难免会有不尽人意的地方,你也许需要回退到某一个版本,但是在这个过程中可能有一些文件你想保留,也有一些文件你不想保留,这就牵扯到很复杂的版本管理过程,在这里给大家推荐几种方法。
1. 若是你编辑了工程,在没有提交的前提下,你想放弃这些修改,你可以直接选择revert就可以更新到工程的最新的版本。
2. 若是你想退回到某一个版本,你就可以直接选择update to reversion如图,这样我们就可以把我们的版本回退到你选中的版本去,这种情况下SVN并没有显示出有什么冲突,并且新建立的文件也还在,但是在这种情况下你并不能直接在你回退后的版本上进行编辑,因为SVN的版本控制还是在最新的主干上。我们需要update并解决冲突。
3. 你可以直接选择revert changes from this revision如图,这样的话你可以直接解决冲突并提交。不过这种方法的不足是,你新建的文件都没有了,整个工程都回退到之前的版本了。
4. 我推荐的一种方法是,直接export一个你需要的版本,然后用你export的版本覆盖你的最新的版本,这样你就可以不丢失你新建的文件,同时获得head的SVN控制文件。
图 13
每个工程会有很多个小模块,当某个模块达到稳定的时候,你就需要提交一次,以免写下个模块代码的时候出现不可恢复的错误。
每一次提交需要前,需要通过pclint检查,保证是一个编译没有错误的版本。当提交比较稳定的版本的时候,同时要修改你的版本号。
3.5.分支与分支的合并
3.5.1. 什么是分支?
假设你的工作是维护本公司一个部门的手册文档,一天,另一个部门问你要相同的手册,但一些地方会有“区别”,因为他们有不同的需要。
这种情况下你会怎样做?显而易见的方法是:作一个版本的拷贝,然后分别维护两个版本,只要任何一个部门告诉要做一些小修改,你必须选择在对应的版本进行更改。
你也许希望在两个版本同时作修改,举个例子,你在第一个版本发现了一个拼写错误,很显然这个错误也会出现在第二个版本里。两份文档几乎相同,毕竟,只有许多特定的微小区别。
这是分支的基本概念—正如它的名字,开发的一条线独立于另一条线,如果回顾历史,可以发现两条线分享共同的历史,一个分支总是从一个备份开始的,从那里开始,发展自己独有的历史(见图)。
Subversion允许你并行的维护文件和目录的分支,它允许你通过拷贝数据建立分支,记住,分支互相联系,它也帮助你从一个分支复制修改到另一个分支。最终,它可以让你的工作拷贝反映到不同的分支上,所以你在日常工作可以“混合和比较”不同的开发线。
3.5.2 分支合并
在工作的目录下点右键TortoiseSVN à Merge… 打开合并工具
如下图所示,可以选择从一个版本合并到另一个版本,在合并之前,可以点Diff比较这两个版本的异同,然后就可以点Merge合并.
l 首先比较第一个窗口与第二个窗口,把结果修改合并到第二个窗口。
l 然后确保光标处于第二个窗口时,点击上图中红色圈圈所示的按钮。这样会把第二个窗口的内容全部复制到第三个容口。之后保存,退出。
l 然后在工程目录上点右键,进行SVN->Resolved。这样会删除无用的临时文件。
l 最后提交所作的修改,并添加详细的注释。
参考文献:
1.《使用Subversion进行版本控制》针对 Subversion 1.1(本书编译对应1876修订版本)Ben Collins-Sussman Brian W. Fitzpatrick C. Michael Pilato 版权 © 2002, 2003, 2004, 2005 Ben Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato
2.《版本控制之道:使用Subversion》(第2版) (美)梅森(Mason,M.)[同作者作品] 陶文[同译者作品] 电子工业出版社
25
展开阅读全文