1.6 使用SVN进行协作开发
随着软件工程化的不断深入,项目版本管理是每个软件开发团队都必须面对的问题。如果没有好的版本控制和版本管理,大项目可能无法顺利进行。对于需要许多基于互联网的开源项目,版本控制和版本管理则更为重要。即使是对于一个人开发,版本管理工作也很有益处,它能让你的工作条理清晰,避免许多重复工作。
通常我们会选择合适的版本控制工具来进行版本控制和版本管理,目前流行的版本控制工具有如下几个:
CVS(Concurrent Versions System):目前开源项目、Java项目中应用最广泛的版本控制工具,支持UNIX、Linux和Windows等各种平台。
SVN(Subversion):SVN是CVS的替代产物,SVN尽力维持CVS的用法习惯,并对原来的CVS进行了增强。
VSS(Visual Source Safe):Windows项目的版本控制工具。具有简单易用、方便高效的特征,但与Windows操作系统及微软开发工具高度集成。
疯狂Java体系的《轻量级Java EE企业应用实战》已经介绍了CVS工具的用法,用过CVS的读者可能已经感受了CVS带来的便捷,本书接下来介绍的SVN将让你感觉到更多的便捷。
在2000年年初,开发人员需要一个CVS自由软件的代替品,它既能保留CVS的基本思想,又能突破CVS的错误和局限。在这种背景下,CVS软件的作者Karl Fogel开始重新设计、开发了一个新的版本控制工具:SVN。后来的事实表明:SVN比CVS更优秀、更简单、易用。可以简单地归纳成一句话:SVN就是CVS的全新升级版。
相对于CVS版本控制工具,SVN具有如下优势:
统一的版本号:CVS是对每个文件单独顺序编排版本号,因此同一项目内各文件的版本号可能各不相同。对SVN而言,任何一次提交都会对所有文件增加一个版本号,即使该次提交并不涉及的文件也会增加一个版本号,因此SVN同一个项目内所有文件在任意时刻的版本号是相同的。版本号相同的文件构成软件的一个版本。
原子提交:提交要么全部进入版本库,要么一点改变都不发生。这可以保证一次提交不管是单个文件,还是多个文件,都将作为一个整体提交。在这当中发生的任何意外(例如网络传输中断)都不会引起版本的不完整和数据损坏。
目录版本控制:CVS只能记录文件的版本变更历史。但SVN可以跟踪整个目录树的修改,它会记录所有文件和目录的版本变更历史。因此SVN可以记录对项目中所有文件、目录的重命名、复制、删除等操作。
高效的分支和标签:SVN创建分支、标签的开销非常小。
优化过的数据库访问:使得一些操作不必访问数据库就可以做到。这样减少了很多不必要的和数据库主机之间的网络流量。
支持元数据(Metadata)管理:每个目录或文件都可以额外定义一组附件的“属性(Property)”,这些属性是允许用户任意定义的key-value(键/值)对。
优化的版本库存储:SVN采用更加节省空间的存储方式来保存版本库。
1.6.1 下载和安装SVN服务器
与CVS相似的是,使用SVN同样需要先安装SVN服务器,安装SVN服务器可以按如下步骤进行。
1 登录SVN官方站点http://subversion.tigris.org/servlets/ProjectDocumentList,看到如图1.40所示的页面,下载SVN最新版的安装程序。
图1.40 下载SVN服务器安装程序
2 通过如图1.40所示页面中的下载链接即可下载SVN服务器的最新版,至笔者成书之时,SVN服务器的最新版是1.6.6,下载该版本的SVN即可。下载完成后得到一个Setup-Subversion-1.6.6.exe文件。
3 单击下载得到的安装文件即可开始安装SVN服务器。安装SVN服务器与安装普通程序并无任何区别,故此处不再赘述。
安装完成后,即可看到系统PATH环境变量中增加了C:\Program Files\Subversion\bin,这表明安装程序已经将SVN安装路径下的bin路径添加到PATH环境变量中,这就允许开发者在命令行窗口使用bin路径下的svn、svnadmin等命令。
1.6.2 配置SVN资源库
安装完SVN服务器之后,接下来同样需要配置一个SVN资源库,与CVS提供了图形界面来配置资源库不同,SVN直接使用简单的命令来配置资源库。
为SVN配置资源库按如下步骤进行即可。
1 在磁盘上任何地方创建一个空文件夹,该文件夹专门用于保存SVN资源库。例如,笔者在G:\盘根目录下创建一个名为“svnData”(这个名字可以随意)的文件夹。
2 启动命令行窗口,执行如下命令:
svnadmin create G:\svnData\webDemo
上面命令中svnadmin是SVN服务器提供的一个工具,create是创建资源库的选项,webDemo就是所创建资源库的名称。
经过上面两步,我们就在G:\svnData目录下创建了一个名为“webDemo”的资源库,接下来还要对webDemo资源库作进一步配置。
1 进入G:\svnData\webDemo目录下,该目录就是SVN所创建的资源库。在路径的conf子路径下保存了SVN资源库的相关配置信息。
2 打开G:\svnData\webDemo\conf目录下的svnserve.conf文件,取消该文件中如下两行的注释:
anon-access = read auth-access = write
上面代码第一行指定允许匿名用户读取该资源库(如果想禁止匿名用户读取,只需改为anon-access= none即可),第二行指定允许授权用户对该资源库执行读取、写入操作。
3 还是G:\svnData\webDemo\conf目录下的svnserve.conf文件,取消该文件中如下一行的注释:
password-db = passwd
上面代码指定该SVN资源库使用passwd文件来保存用户名、密码——当然开发者也可以改变保存用户名、密码的文件名。这个保存用户名、密码的passwd文件也保存在G:\svnData\webDemo\conf路径下。
4 打开G:\svnData\webDemo\conf路径下的passwd文件,在该文件中添加如下内容:
crazyit.org=123
上面代码为该SVN资源库增加了一个用户,用户名是crazyit.org,密码是123。
经过上面几个步骤,SVN服务器配置完成。
接下来应该启动SVN服务器程序了,在命令行窗口运行如下命令即可启动SVN服务器:
svnserve -d -r G:\svnData
上面命令中svnserve是SVN服务器安装路径下bin路径下的一个可执行程序,G:\svnData就是SVN资源库的保存位置。运行上面命令即可启动SVN服务器,运行SVN服务器需要3690端口,如果其他程序已经占据了该端口,那将导致SVN服务器启动失败。
每次都通过命令行来启动SVN服务器也是一件很烦琐的事情,因此我们可以将SVN服务器程序安装成Windows服务。可以借助于Windows提供的sc.exe工具来实现,运行如下命令即可将SVN服务器程序安装成Windows服务:
sc create svn binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service -r G:\svnData" displayname= "Subversion服务" depend= Tcpip
上面命令中sc就是Windows自带的Windows服务配置程序,其中create用于安装Windows服务,svn是服务名,这个可以随意改变。
提示
一旦将某个程序安装成Windows服务,我们就可以通过运行Windows平台的services.msc来管理这些服务,包括把它们设置成自动启动的Windows服务。
运行上面命令之后,即可在Windows服务管理窗口看到如图1.41所示的SVN服务。
如果希望从Windows中删除该SVN服务也是允许的,只要运行如下命令即可删除SVN服务:
sc delete svn
图1.41 将SVN安装成Windows服务
1.6.3 下载和安装SVN客户端
对于普通开发者而言,通常会选择使用TortoiseSVN作为SVN客户端。在Windows平台上下载和安装TortoiseSVN非常简单,按如下步骤进行即可。
1 登录TortoiseSVN官方下载站点http://tortoisesvn.net/downloads,下载TortoiseSVN的最新版,至笔者成书之时,TortoiseSVN的最新稳定版是1.6.7。
2 下载TortoiseSVN 1.6.7,下载完成后得到一个TortoiseSVN-1.6.7.18415-win32- svn-1.6.9.exe文件,双击该文件即开始安装,安装TortoiseSVN与安装普通软件并无太大区别。
安装完成后,TortoiseSVN安装程序要求重启计算机,重启计算机完成TortoiseSVN安装。
TortoiseSVN与普通软件不同,它并未直接提供任何窗口来执行版本管理操作,按它的官方说法:TortoiseSVN只是一个Shell扩展,它已经被整合到了Windows资源管理器中,因此使用TortoiseSVN非常简单,只要右键单击任何文件夹、文件,即可在弹出的快捷菜单中看到TortoiseSVN对应的菜单。图1.42显示了右键单击文件夹时出现的TortoiseSVN工具菜单。
图1.42 右键单击文件夹时看到的TortoiseSVN工具菜单
1.6.4 发布项目到服务器
使用TortoiseSVN将项目发布到服务器比使用CVS更加简单,假设我们在磁盘上开发了一个简单的Web项目,现在希望将该项目发布到SVN服务器上,按如下步骤进行即可。
1 右键单击该Web应用对应的文件夹。
2 在弹出的如图1.42所示的快捷菜单中选择“TortoiseSVN -> Import”菜单项,TortoiseSVN弹出如图1.43所示的对话框。
3 按图1.43所示的样式输入SVN资源库的URL,然后单击“OK”按钮,系统就会弹出如图1.44所示的提示输入登录SVN服务器的用户名、密码对话框,如果输入正确即可将该项目发布到SVN服务器。
图1.43 将项目发布到服务器
图1.44 输入登录SVN服务器的用户名、密码
1.6.5 从服务器下载项目
从服务器下载项目同样简单,假设项目组另一个人想从服务器上下载刚刚发布的webDemo项目,按如下步骤进行即可。
1 在想下载项目的目标磁盘空间的空白处单击鼠标右键。
2 在弹出的如图1.42所示的快捷菜单中选择“SVN Checkout”菜单项,TortoiseSVN弹出如图1.45所示的对话框。
图1.45 从磁盘下载项目
3 按图1.45所示的样式输入SVN资源库的URL,并指定将项目下载到本地磁盘的指定位置。然后单击“OK”按钮,项目下载成功(从SVN服务器下载项目只需只读权限,因此SVN服务器无须输入登录SVN服务器的用户名、密码)。
从SVN服务器下载的项目、文件上多有一个绿色的小钩,这表明该项目、该文件与服务器项目状态一致。
1.6.6 提交(Commit)修改
从服务器下载了指定项目之后,开发者可采用自己喜欢的任何方式对项目进行开发,当项目开发到一定阶段之后,接下来应该将自己手中所做的修改提交到服务器上,这样其他开发者也能得到该项目最新修改过的版本。
SVN项目修改过的文件的图标以及该文件所在文件夹的图标都会增加一个红色的感叹号,这表明该文件或该文件夹被修改过,需要将该修改提交到服务器。
提交修改也非常简单,按如下步骤进行即可。
1 选中需要提交的一个或多个文件,或者选中这些文件所在的文件夹。
2 右键单击选中的文件或文件夹,在弹出的快捷菜单中单击“SVN Commit”菜单项,TortoiseSVN将弹出如图1.46所示的对话框。
图1.46 提交修改
3 按图1.46所示的样式选中需要提交的文件,然后单击“OK”按钮,系统就会弹出如图1.44所示的提示输入登录SVN服务器的用户名、密码对话框,如果输入正确即可将修改提交到SVN服务器。
1.6.7 同步(Update)本地文件
同步,也叫Update,就是把远程项目中最新的修改同步到本地。在多人协同工作的环境下,远程资源库中的某些文件可能已经被其他开发者修改过了,SVN服务器上保存了各文件修改后的最新版本。同步操作能够把最新版本下载到本地,从而允许我们在别人修改的最新版本上进行修改,这样既可以避免版本冲突,也可以避免浪费精力和重复劳动。
提示
对于多人协同开发的环境,通常推荐总是“先同步后工作”,即每次准备开发之前,总应该先同步一次,从而保证我们在项目的最新版本上进行开发。
同步本地文件请按如下步骤进行。
1 使用鼠标选择需要同步的文件或文件夹。如果选择一个或多个文件,则表明仅同步这些文件;如果选择一个或多个目录,则会同步这些目录下的所有文件。
2 右键单击选中的文件或文件夹,在弹出的快捷菜单中单击“SVN Update”菜单项,TortoiseSVN将弹出如图1.47所示的对话框。
图1.47 同步本地文件
1.6.8 添加文件和目录
随着项目的逐渐开发,我们需要向项目中新增一些文件,但新增的文件并不会自动处于SVN的管理之下。例如,我们在G:\webDemo(笔者的本地工作路径)下新建了images文件夹和help.jsp文件,则可看到Windows资源管理器显示如图1.48所示的界面。
图1.48 新建的文件和文件夹
从图1.48中可以看出,该文件和文件夹上没有任何标记,这表明该文件还未处于SVN管理之下,这就需要将该文件添加到SVN中。
向SVN中添加文件请按如下步骤进行。
1 选中需要添加的文件和文件夹。
2 右键单击选中的文件或文件夹,在弹出的快捷菜单中单击“TortoiseSVN -> Add”菜单项,TortoiseSVN将弹出如图1.49所示的对话框。
图1.49 添加文件和文件夹
3 单击如图1.49所示对话框中的“OK”按钮,文件添加完成。
需要指出的是,经过上面三个步骤添加文件、文件夹之后,只是将该文件和文件夹置入TortoiseSVN管理之下,还并未提交到服务器上。为了将所添加的文件、文件夹提交到服务器,还需要对它们执行提交操作。
注意
添加文件、文件夹之后,还必须执行提交操作,否则添加的文件、文件夹不会提交到服务器。
1.6.9 删除文件和目录
与添加文件、文件夹相对的是,项目开发过程中也需要删除某些文件和文件夹,通过TortoiseSVN删除指定的文件、文件夹非常简单,按如下步骤进行即可。
1 选中需要删除的文件和文件夹。
2 右键单击选中的文件或文件夹,在弹出的快捷菜单中单击“TortoiseSVN -> Delete”菜单项,删除成功。
与添加文件、文件夹类似的是,通过上面两个步骤删除文件、文件夹之后,只是从TortoiseSVN管理下、本地磁盘删除了该文件和文件夹,还并未提交到服务器上。为了将所做的删除操作提交到服务器,还需要执行提交操作。
注意
删除文件、文件夹之后,还必须执行提交操作,否则在本地所做的删除操作不会提交到服务器。
1.6.10 查看文件或目录的版本变革
TortoiseSVN提供了图形界面方式来查看文件、文件夹的版本变革历史,并比较任意两个版本之间的差异。
查看文件或文件夹的版本变革历史请按如下步骤进行。
1 选中需要查看的文件或文件夹。
2 右键单击选中的文件或文件夹,在弹出的快捷菜单中单击“TortoiseSVN -> Revision graph”菜单项,系统弹出如图1.50所示的对话框。
图1.50 查看文件的版本变革
如图1.50所示的对话框非常形象地显示了index.jsp文件的版本历史。
1.6.11 从以前版本重新开始
如果在开发过程中把某个文件改坏了,我们希望重新找回该文件以前的某个版本,那应该怎么做呢?TortoiseSVN提供了很方便的操作允许我们从某个文件的以前版本重新开始开发。
图1.51 从文件以前的版本重新开始
从指定文件的以前版本重新开发请按如下步骤进行。
1 选中需要重新开始的一个或多个文件。
2 右键单击选中的文件,在弹出的快捷菜单中单击“TortoiseSVN -> Update to revision”菜单项,系统弹出如图1.51所示的对话框。
3 按图1.51所示输入希望重新开始的版本号,然后单击“OK”按钮,选中的文件将恢复到指定的版本。接下来,就可在此版本的基础上继续开发了。
1.6.12 创建分支
在有些时候,我们不想继续沿着开发主线开发,而是希望试探性地添加一些新功能,这时候就需要在原来开发主线上创建一个分支(Branch),进而在分支上进行开发,避免损坏原有的稳定版本。
创建分支请按如下步骤进行。
1 选定需要创建分支的文件或文件夹(甚至可以是整个项目所在的文件夹)。
2 右键单击选中的文件或文件夹,在弹出的快捷菜单中单击“TortoiseSVN -> Branch/tag”菜单项,系统弹出如图1.52所示的对话框。
3 单击如图1.52所示对话框中的“OK”按钮,创建分支成功。
图1.52 创建分支
当分支创建成功后,我们可以在该文件的版本变革图中看到该分支的效果,如图1.53所示。
图1.53 新建分支后的效果
新建分支后,我们就可以在新分支的基础上进行开发了,从而避免损坏原有的文件版本。
1.6.13 沿着分支开发
为了沿着分支进行开发,要求我们先切换到分支所在的版本。
为了切换到指定分支继续开发,可按如下步骤进行。
1 选中拥有分支的文件或文件夹。
2 右键单击选中的文件或文件夹,在弹出的快捷菜单中单击“TortoiseSVN -> Switch”菜单项,系统弹出如图1.54所示的对话框。
3 单击如图1.54所示对话框中的“OK”按钮,当前文件就会切换到指定分支,接下来对该文件所做的修改都将沿着该分支开发。
图1.54 切换到指定分支
例如,切换到index_branch.jsp之后继续对该页面进行修改,修改完成后将所做的修改提交到SVN服务器,再次查看该页面的版本变革历史,将看到如图1.55所示的对话框。
图1.55 沿着分支开发
如果开发者沿着分支开发了一段时间之后,想继续维护开发主线上的开发,则还可以切换回开发主线继续开发,从分支切换回开发主线与切换到分支并无任何区别,故此处不再赘述。
1.6.14 合并分支
当项目沿着分支试探性开发新功能达到一定的稳定状态之后,此时我们可以将开发主线和开发分支合并到一起,从而将分支中的新功能添加到开发主线中。
为了实现合并,可以按如下步骤进行。
1 选中拥有分支的文件或文件夹。
2 右键单击选中的文件或文件夹,在弹出的快捷菜单中单击“TortoiseSVN -> Merge”菜单项,系统弹出如图1.56所示的对话框。
图1.56 选择合适的合并选项
3 在如图1.56所示的对话框中选择合适的合并选项之后,单击“Next”按钮,TortoiseSVN弹出如图1.57所示的对话框。
图1.57 合并分支
4 按图1.57所示的样式输入需要合并的分支,并指定将分支合并到文件的哪个版本,然后单击“Next”按钮,TortoiseSVN弹出如图1.58所示的对话框。
图1.58 设置合并选项
5 按图1.58所示形式设置合并选项,然后单击“Merge”按钮即可完成合并。
1.6.15 使用NetBeans作为SVN客户端
很多时候我们没有必要使用TortoiseSVN作为SVN客户端,尤其是当使用那些功能强大的IDE工具时,这些IDE工具往往都集成了SVN客户端,因此直接使用这些IDE工具作为SVN客户端即可。
下面以NetBeans作为SVN客户端为例来介绍下载项目、同步文件、提交修改等操作。
NetBeans提供的SVN支持主要由“团队开发”菜单中的“Subversion”菜单项提供,单击NetBeans主菜单中的“团队开发 -> Subversion”菜单项,系统将弹出如图1.59所示的二级菜单。
通过二级菜单中的SVN相关菜单项即可执行与TortoiseSVN完全相似的版本管理操作,例如,以“签出”(Checkout)菜单项为例,介绍通过NetBeans从SVN服务器下载项目。
图1.59 NetBeans提供的SVN支持
提示
可能读者会对中文界面的NetBeans感到不习惯,这可能是因为有些中文的翻译总让人感觉别扭,例如此处的“签出”菜单,其实就是前面介绍的Checkout。实际上,我们安装的NetBeans(安装程序文件名中有ml字样,表明它是多国语言版)完全可以切换成英文界面,进入NetBeans安装路径下etc子目录,打开其中的netbeans.conf文件,在该文件中找到netbeans_ default_options属性,在该属性值后追加如下内容:
-J-Duser.language=en -J-Duser.country=US
上面代码指定NetBeans的启动环境是美式英语,这样NetBeans将会以英文界面启动。
从服务器下载项目的步骤如下:
1 单击如图1.59所示菜单中的“签出”菜单项,即可看到NetBeans弹出如图1.60所示的对话框。
图1.60 登录指定的SVN资源库
2 单击如图1.60所示对话框中的“下一步”按钮,NetBeans弹出如图1.61所示的对话框。
图1.61 指定从服务器下载的文件夹
通过上面介绍可以看出,使用NetBeans从服务器下载项目非常简单。使用NetBeans执行其他SVN操作如同步本地文件、提交修改等,也都是通过如图1.59所示二级菜单中的菜单项完成的,与从服务器下载项目的步骤基本类似,故此处不再赘述。