SubVersion基本概念与快速流程,做大项目必备
在项目应用版本管理是一件愉快的事情,多人协作开发、版本回溯等等都是让人很激动的事情。可是为了基本的应用,我学习SVN也需要了一定的时间。网上介绍SVN的文章还是比较多的,但是自己实践下来对学习影响不大,基本上都没有介绍一些基本概念与流程,本文也是为了谈谈这些。
概述
SVN是一种版本控制工具,可供多人协作开发,将各个人不同的修改代码集成到一起。SVN的重要功能是版本回溯,不要小看这个功能,实际用起来才可以体会到其中的妙处,可谓"谁用谁知道"。
SVN的版本控制模型是"拷贝-修改-合并"。在建立了版本库之后,工作之前应该先下载需要工作的文件(工作拷贝)到本地电脑上,可以放在某个文件夹中。然后对工作拷贝进行修改,比如添加、修改、删除源代码等等。最后将修改之后的工作拷贝提交到版本库中,称为合并。在多人协作中也是同样的,只是最好不要两个人同时修改同一个文件,否则会产生"冲突",虽然也可以解决,只是有些麻烦。
·拷贝:从SVN版本库获取工作拷贝的过程。将会把所有的工作文件放入一个文件夹中。
·工作拷贝:名词,从SVN版本库中得到的一份工作文件集合。工作拷贝中会包含.svn文件夹,其中记录了原始文件,当修改时也会有所发觉。工作时就是对工作拷贝进行修改。
·合并:将已经修改过的工作拷贝提交到SVN版本库的过程。
·SVN版本库:用于存储工作拷贝文件集的仓库,对外提供一定的接口供SVN客户端使用。对外接口可以是文件系统、SVN服务、apache插件提供的SVN服务等等。一定要区别SVN版本库和工作拷贝。SVN版本库是一个数据库,其中的内容不推荐访问,更不要改动,在这里一般也找不到你的工作文件。
建立版本库的过程
在使用SVN进行源码管理之前需要先建立SVN版本库。建立SVN版本库是相对比较简单的,可以用如下命令:
# svnadmin create foldername
其中foldername替换成你的文件夹名字。版本库是一个数据库,可用的数据库包括FS和BDB两种,推荐使用FS,当然也是默认的,会稳定一些。
建立版本库之后,需要确定一种版本库的访问接口。因为访问接口这个参数会直接存储到工作拷贝中,待之后提交时会使用,所以接口不要随便改变,很麻烦。可用的方式有文件系统、SVN服务和HTTP服务(apache),推荐使用SVN服务。
如果使用了文件系统,则以后移动版本库所在路径时会直接影响所有工作拷贝,很不方便,而初学者随着SVN知识的增加,有所改动是很正常的。HTTP服务则是直接面对大型多用户服务器的,配置起来有一定的难度。SVN服务则可以看在本机运行,提供局域网或者互联网上的服务。推荐使用的方式就是在本机上建立SVN版本库,然后接口路径写上"svn://localhost/projectname"。比如笔者经常行走于公司和家之间,一些个人兴趣的小程序放在U盘上,所以就将SVN版本库放在U盘上。每次到一个地方用U盘里面的批处理文件开启SVN服务,下载工作拷贝并开始工作。修改完成后提交,随之删除本地的工作拷贝。
SVN版本库的URL规则
·file:///
以路径方式访问文件系统上的SVN。可以用相对路径和绝对路径。例如Windows上的一个例子"file:///e:/svn/db1"。
·http://
通过Apache的WebDAV协议访问。略。
·https://
与http://方式相似,提供SSL链路加密。
·svn://
本文推荐方式,使用svnserve建立服务。例如"svn://localhost/db1"。
·svn+ssh://
与svn://相似,提供SSH封装
使用SVN服务
可以用已经安装的svnserve提供SVN服务,如下,启动一个叫做db1的版本库
# svnserve -d -r "e:/svnroot/db1"
这样就可以通过"svn://localhost"来访问这个版本库了。但是一般来说,正开发的程序或者加上以往的版本库,正在使用的版本库可能不只一个,所以推荐建立一个SVN版本库的版本库。将所有版本库都放在一个文件夹中,比如我就是建立一个叫做svnroot的文件夹,其中放了很多版本库。上述的命令也可以改为:
# svnserve -d -r "e:/svnroot"
这样可以通过"svn://localhost/db1"来访问特定版本库。
另外,通过网络来提供SVN服务,无论是局域网还是WWW都是需要一定的权限控制的,否则发生了混乱可不是什么好事情。关于SVN服务的权限设置可以参考我的另外一篇小文《SVN服务器的简单配置》。一般在一个局域网内都是允许匿名下载,但是需要认证上传的方式,很多开源软件也是使用同样的方式。
一般的工作流程
很多时候对一种不熟悉的事物,如果可以按照一般的流程走过一遍便可以有很多的了解了。下面我们谈谈一般的工作流程,初学者可以按照这个步骤下来完成一次完整的SVN试验。
1、下载,安装SVN
一般来说命令行版本只需要安装svn-setup即可,安装完成是自动识别语言的,即在你的中文版操作系统上可以自动显示中文。但是往往很多用户比较倾向于使用SVN的win32扩展版本,只需要右键菜单即可完成几乎所有操作。这时需要安装TortoiseSVN,并且,安装完成后再安装其中文包。笔者推荐不要安装中文包,因为很多特定的名次现在的翻译还不是很统一,还是看着英文比较通用,比如commit、update、export、import等等,这些词在SVN中有特定的意义。安装过程不需要任何设置。
2、建立一个测试用的版本库
推荐使用命令行版本的SVN建立,使用方法上面有,使用TortoiseSVN也可以,不过注意一定要选本地文件系统,其名字可能是如下的几个之一:
Native filesystem
FSFS
不要选择BerkeleyDB(BDB),因为一些高手测试过,使用BDB不是那么稳定。而版本库是比较重要的,儿戏不得。当然,犹如"使用SVN服务"说的一样,推荐建立一个SVNROOT来存放所有的版本库,这样在将来使用多个版本库的时候不是那么狼狈。
3、配置版本库的网络权限
参见文章《SVN服务器的简单配置》。
4、启动SVN服务
如上
5、准备一些将要进行版本控制的源代码,或其它文件
文件类型随便,SVN都可以处理。
6、首次导入(import)
对需要进行版本控制的源码,需要先导入到版本库中,形成第一个修订版本。使用import命令,可以使用TortoiseSVN的IMPORT命令或者是svn import命令。首次导入之后,版本库中就已经包含了版本控制文件了,以前导入的文件也就可以删除了。但是注意,已经导入的文件是存储在版本库的数据库当中,不要试图从版本库的文件夹中找到你已经导入的代码,更不要手动修改版本库。只要记住一条即可,不要进入版本库所在的文件夹,你所作的任何修改都可能造成损坏并且你也找不到任何可读的信息。
# svn import path svnurl
7、首次检出(checkout)
需要将版本库的代码检出(checkout)到一个文件夹,就得到了一份工作拷贝,可以对工作拷贝进行修改。可以使用SVN CHECKOUT命令。注意,不要检出到刚才用于导入(import)的文件夹,否则文件的覆盖会出现错误,如果确实很需要,就先删除原文件夹中的所有内容,然后检出(checkout)。检出所得的工作拷贝,每个文件夹中都包含一个.svn文件夹,其中包含了SVN的一些信息,有如版本库,不要进入这个文件夹,没什么好处。
# svn checkout svnurl targetpath
8、do it yourself
现在可以修改你的代码了,随你怎么修改都可以。当然,这也是工作的一部分。我的很多同事都是在代码中删除回车,空格等等来实现一些无关紧要的修改来做测试的。
9、提交(commit)
修改完成之后,可以将修改提交到版本库。提交时可选的填入一条修改注释,应该重视这个注释,仔细的填写,这对以后取出某一个版本时非常有用。我每每要写好多字。注意如下的命令中并没有指定SVN url,因为已经保存在了.svn文件夹当中了。
# svn commit --message "..."
10、导出(export)
如果你对某一个修订版比较满意,需要交给测试人员,或者干脆就发布了,就可以选择导出这个发行版。导出的发行版是不包含SVN控制信息的,也就是不包含.svn文件夹。对于很多时候,如果去测试一些开源软件,也推荐用这种方式来获取开发状态的代码。SVN检测文件是否修改的方式就是在.svn文件夹中包含上一版本的文件。这样,如果是checkout而不是export则会取得两份文件,其中一份是隐藏的,这对很多牛速的SVN服务器来说可不是什么好事。另外,如果你没有提交权限,保留着.svn也是没有任何用处的。
# svn export svnurl targetpath
11、更新(update)
如果你遇到了一个喜欢加班的同事,在你下班提交数据之后,他还做了修改,并且他也提交过了,在第二天你再次面对工作时,版本库的修订版就已经高于你的工作拷贝了,这时可以用更新(update)操作来将当前代码更新到最新版本去。如果在更新之前你又做了修改了,那也不必担心,你的修改不会被覆盖掉。但是如果这段时间你的这个同事也对这个文件进行了修改,那么就会形成一个冲突,这是高级内容,稍候再谈。
# svn update
12、检查工作拷贝状态(status)
在使用TortoiseSVN时不会碰到这个问题,所有操作的文件都会在图标上有小图标显示,比如对号就是没有修改过的,叹号是修改过的,等等。但是对于命令行版本则没有这些提示,这时可以用status操作来显示工作拷贝中各个文件已经做过的修改。
# svn status
工作流程模型
导入->检出->修改->提交->导出
import -> checkout -> 修改 -> commit -> export
按照这个工作流程模型就可以理顺几种近义词的区别了。当然,区分版本库、工作拷贝也是一个十分艰巨的工作。
祝大家工作愉快。