如果没有版本控制工具的协助,在开发中我们经常会遇到下面的一些问题:
一、 代码管理混乱。如果是别人添加或删除一个文件,你很难发现。没有办法对文件代码的修改追查跟踪。甚至出现文件丢失,或新版本代码被同伴无意覆盖等现象。
二、 解决代码冲突困难。当大家同时修改一个公共文件时,解决代码冲突是一件很头疼的事。最原始的办法是手工打开冲突文件,逐行比较,再手工粘贴复制。更高级的做法是使用文件比较工具,但仍省不了繁杂的手工操作,一不小心,甚至会引入新的bug。
三、 在代码整合期间引入深层BUG。例如开发者A写了一个公共函数,B觉得正好可以复用;后来A又对这个公共函数进行了修改,添加了新的逻辑,而这个改动的却是B不想要的。或者是A发现这个公共函数不够用,又新做了一个函数,B却没有及时获得通知。这些,都为深层BUG留下隐患。
四、 无法对代码的拥有者进行权限控制。代码完全暴露在所有的开发者面前,任何人都可以随意进行增、删、改操作,无法指定明确的人对代码进行负责。特别是产品的开发,这是极其危险的。
五、 项目不同版本发布困难。特别是对产品的开发,你会频繁的进行版本发布,这时如果没有一个有效的管理产品版本的工具,一切将变得非常艰难。
上面只是列举了一些没有版本控制系统可能带来的问题,特别是对大型项目和异地协同开发有了一个合适的版本控制工具,它可以有效解决因为代码版本不同引起的各种问题,让我们的开发人员能更多的把精力花费在开发上面。而不是每次都花费很多时间进行代码整合和解决版本不同带来的各种问题。 主流版本控制工具介绍
现在,有很多优秀的版本控制工具供我们选择,下面就五种主流的版本控制工具做简单的介绍。
Starteam
是一个集合了版本控制、构建管理(Build Management)和缺陷跟踪系统为一体的软件,并且具有强大的图形界面,易学易用;但管理复杂、维护困难。2002年底被Borland公司收购。
PVCS Version Manager
是美国的MERANT公司软件配置管理工具PVCS 家族中的一个组成部分,它能够实现源代码、可执行文件、应用文件、图形文件和文档的版本管理;它能安全地支持软件并行开发,对多个软件版本的变更进行有效的控制管理。
ClearCase(CC)
是ROSE构件的一部分,目前最牛的配置管理工具,主要应用于复杂的产品发放、分布式团队合作、并行的开发和维护任务。可以控制word, excel,powerpoint,visio等文件格式,对于不认识的格式可以自己定义一种类型来标识。
Visual SourceSafe(VSS)
简单易用、方便高效、与Windows操作系统及微软开发工具高度集成。
CVS(Concurrent Versions System)
是开发源码的并发版本系统,它是目前最流行的面向软件开发人员的源代码版本管理解决方案。它可用于各种平台,包括 Linux 、Unix和 Windows NT/2000/XP等等。
前面三种是重量级的商业版本控制工具,更适合庞大的团队和项目,并且价格不菲。Visual SourceSafe是微软的产品,当然只能用在windows平台并与微软的开发工具无缝集成。CVS免费开源,并且几乎所有开源项目都是使用CVS进行版本管理,无疑,它是我们Java开发者最优选择。 CVS的历史、功能、基本概念的介绍 历史
CVS 诞生于 1986 年,当时作为一组 shell 脚本而出现;1989年3月,Brian Berlinor用C语言重新设计并编写了CVS的代码;1993年前后,Jim Kingdon最终将CVS设计成基于网络的平台,开发者们能从Internet任何地方获得程序源代码。 功能介绍
一、 代码统一管理,保存所有代码文件更改的历史记录。对代码进行集中统一管理,可以方便查看新增或删除的文件,能够跟踪所有代码改动痕迹。可以随意恢复到以前任意一个历史版本。并避免了因为版本不同引入的深层BUG。
二、 完善的冲突解决方案,可以方便的解决文件冲突问题,而不需要借助其它的文件比较工具和手工的粘贴复制。
三、 代码权限的管理。可以为不同的用户设置不同的权限。可以设置访问用户的密码、只读、修改等权限,而且通过CVS ROOT目录下的脚本,提供了相应功能扩充的接口,不但可以完成精细的权限控制,还能完成更加个性化的功能。
四、 支持方便的版本发布和分支功能。 基本概念
资源库(Repository)
CVS的资源库存储全部的版本控制下的文件copy,通常不容许直接访问,只能通过cvs命令,获得一份本地copy,改动后再check in(commit)回资源库。而资源库通常为与工作目录分离的。CVS通过多种方式访问资源库。每种方法有不同目录表示形式。
版本(Revision)
每一个文件的各个版本都不相同,形如1.1, 1.2.1,一般1.1是该文件的第一个revision,后面的一个将自动增加最右面的一个整数,比如1.2, 1.3, 1.4...有时候会出现1.3.2.2,原因见后。revision总是偶数个数字。一般情况下将revision看作时CVS自己内部的一个编号,而tag则可以标志用户的特定信息。
标签(Tag)
用符号化的表示方法标志文件特定revision的信息。通常不需要对某一个孤立的文件作tag,而是对所有文件同时作一个tag,以后用户可以仅向特定tag的文件提交或者checkout。另外一个作用是在发布软件的时候表示哪些文件及其哪个版本是可用的;各文件不同revision可以包括在一个tag中。如果命名一个已存在的tag默认将不会覆盖原来的;
分支(Branch)
当用户修改一个branch时不会对另外的branch产生任何影响。可以在适当的时候通过合并的方法将两个版本合起来;branch总是在当前revision后面加上一个偶数整数(从2开始,到0结束),所以branch总是奇数个数字,比如1.2后面branch为1.2.2,该分支下revision可能为1.2.2.1,1.2.2.2,...
冲突(Conflct)
完全是纯文本的冲突,不包含逻辑上的矛盾。一般是一份文件,A做了改动,B在A提交之前也做了改动,这样最后谁commit就会出现冲突,需要手工解决冲突再提交。 CVS与eclipse集成开发
前面对CVS的历史、功能、概论等理论知识做了介绍。下面我们将使用最流行的Java IDE Eclipse中内置的CVS工具,以一个完整开发流程,介绍实际环境中CVS的正确使用。关于CVS系统的安装,不是本文的内容,您可以从附录的链接中获取安装的介绍资料。 常用的CVS控制命令
Check Out(检出)
把源文件从cvs源代码仓库中取出,缺省的版本是最新的版本,你也可以选择指定的版本。在每次更改源代码之前,需要Check Out最新的版本,再起基础之上对源代码进行修改。将代码目录checkout到指定目录下,所有文件都是read-write。
Check In(检入)
把源代码加入到cvs源代码仓库中,每一个添加进代码库中的文件的版本是 1.1。以后每次修改文件重新ci以后,此文件的版本递增为1.2 ,1.3.……。在每次对源代码修改之后,需要Check In,提交最新版本的源代码。
Synchronize with Repository(与资源库同步,简称同步)
使本地更改与资源库同步,它会列出本地和资源库之间不同的所有文件。
Add to Version Control
将新的文件加入到版本控制之中。
Add to .cvsIgnore
将文件设置到版本控制之外,这样该文件或目录中的文件的更改在CVS中不可见,即使同步也无法发现。 CVS正确使用步骤
一、 同步(Synchronize)
就是将本地更改与服务器同步,同步之后可以清晰的看到上一捡出(Check Out)版本之后本地、服务器上的最新改动。这是非常有用的,特别是敏捷开发,强调集体拥有代码。有了同步功能,你可以全局把握项目的代码,可以很方便的跟踪公共模块代码的任何改动。
具体操作:在Eclipse的资源视图(Resource Perspective)或者Java视图(Java Perspective)中,选中要同步的目录,点击右键选择"Synchronize with Repository",之后它将显示同步的视图。 同步之后,它有四种Mode可以选择,见上图绿色框框里按钮。从做到右分别为:
Incoming Mode:表示修改是来自服务器,对应于更新(update)操作。
Outgoing Mode:表示修改是来自本地,对应提交(commit)操作。
Incoming/ Outgoing Mode:本地和服务器修改都在该模式(Mode)中显示。
Conflicts Mode:显示本地和服务器修改的冲突文件。
二、 更新(update)
比较简单,选择Incoming Mode,再选中要更新的文件,右键选择update操作。
三、 解决冲突并合并(solve conflct and merge)
如果有冲突文件,冲突文件不能更新。你必须先解决冲突再操作。选中冲突的文件,再点右键选择"Open in Compare Editor",用比较工具打开该文件。 比较器(Compare)视图,左边版本底的是本地文件(Local File),右边是远程服务器文件(Remote File)。使用"Select Next Change"按钮(绿框中的第一箭头向下按钮),逐一查看不同点。如果不同点标识为黑色框框,则不用管它。如果是蓝色框框,则需要手工调整。如上图,不同点是蓝色框框,将鼠标放到两个不同点的中间小方框中,则凸出一个向右的按钮,并显示提示信息"Copy Current Change from Right to Left",意思是将右边服务器的不同点覆盖到左边的本地文件。点中此按钮。重复这样的操作,将所有服务器上的更改拷贝到本地。
如果有一行代码,本地和服务器都同时做了修改。这时,修改点则显示红色框框。这时,你就必须手工做正确的修改。全部修改完成,保存本地文件。
此时,如果修改点没有了蓝色的框框,就可以开始做合并(merge)操作了。操作也很简单,选择该文件,点击右键,选择"Mark as merged"。
注意:必须确保没有蓝色框框,即完全拷贝了服务器的修改才可以做合并(merge)操作,否则会覆盖服务器上的代码。
四、 提交(commit)
更新服务器代码,解决冲突之后,首先要查看本地文件修改之后是否有错误。如果有,当然首先解决错误,再提交。 Visual SourceSafe 入门教学
1. 简介
在软件工程的领域里,有一块叫做 SCM(Software Configuration Management),有人管它叫「软件建构管理」。SCM 的传统定义是原始码的版本管理,后来则逐渐演进扩大,还包含了软件开发的一些标准和程序的制定与应用 [Summerville 2000]。版本管理工具对目前的软件开发开环境来说相当重要,因为不管是软硬件环境的改变、需求改变、软件本身的 bug...等等,都会令软件不断地演进,我们必须记录各个版本,以便随时比对版本之间的差异,或者回到(rollback to)过去的某个版本;此外,当项目小组成员众多时,工作交接、多人修改同一个档案等情况,都有可能造成档案的版本混乱。例如一支程序本来由张三撰写,可是因为某些原因(请假、临时支持其它项目、请别人 debug....)暂时由李四修改,后来又交回给张三。如果用传统的档案共享机制,每次有这种情形就要互相通知:我改好啰,请把档案从档案服务器搬回你家,万一有人忘了,可能就会造成档案版本错乱,而东西交到客户手上才发现 bug 依然存在。
因此,如果你曾碰过下列情形,而且深感困扰,你可能就需要版本管理工具的协助:
- 档案不见了(用鼠标拖放档案时误动作,不知道拖去哪儿放了);
- 档案被别人覆盖;
- 想要比对各版本之间有何差异;
- 想要回到之前修改的版本(客户反复无常,设计改来改去....);
- 多人同时修改造成的版本混乱;
- 想要知道谁动过的我的程序代码;
- 跨项目共享组件或模块散落在各处。
目前市场上的版本管理工具已经有很多,环肥燕瘦任君挑选,以下几个可能是大家比较熟悉的:
- Rational Clear Case
- Borland StarTeam
- Merant PVCS Version Manager
- Microsoft Visual SourceSafe(VSS)
- Concurrent Versions System(CVS)
CVS 虽然免费,也有窗口接口,但是入门门坎还是偏高,不易入手,以 unix/linux 社群用得较多;StarTeam 和 ClearCase 功能较强大,价格当然也较贵;PVCS 个人也没使用过,无法提供意见;而 Visual SourceSafe(VSS)功能虽然比较阳春,但是笔者试用之后,觉得如果只需要管理多人开发时的文件和原始码版本,其实还挺好用的,也很容易上手。VSS 在 Visual Studio .NET 光盘中就有附了,价格算是相当实惠。以下是使用 VSS 管理原始码的好处(有些不是 VSS 特有的):
- 建构人员可以实施每周的里程碑版本建立,统一编译所有程序代码,确保交给客户的版本一定是最新的,不会因为某个开发人员忘了把自家 local 的档案复制到 server 的共享目录而遗漏掉。
- leader 不用一天到晚打电话或发 mail 去追谁还没有把新的档案放上 file server。
- 共享单元的更新更简便、确实。
- 提供独立且细微的 user 权限控管,没有 Windows 档案分享时的账户权限检查困扰。
- 同一个档案多人同时修改可自动 merge 最后的修改成果。
- 可将历史版本叫出来比对,显示差异处,以进行合并或修正。
- 提供 Web 应用程序的档案布署功能。
- 可以和多种开发工具整合,例如:Visual Basic、Visual Studio .NET、FrontPage 200x。
注:撰写此文件时,使用的是 VSS 版本是 Visual Studio .NET 1.0 附的 Visual SourceSafe 6.0c。
1.1 基本概念
想象一下没有工具协助的情况下,当多人同时修改一份文件时,要如何确保文件的版本一致?
也许你可以指派一位专人负责管理文件的进出,这个人姑且就叫他 Manager 好了,Manager 待在一间小小的办公室里,负责文件库的维护和文件的进出。当小组成员 Eric 要修改文件时,就拿磁盘到这个窗口请 Manager 复制一份给他,Manager 在复制的同时会记下来:这份文件正由 Eric 修改;而 Eric 则会把磁盘拿到他自己的机器上,把档案复制到他的工作目录(working folder),然后进行修改。等到 Eric 修改完毕,再从工作目录中把档案复制到磁盘上交给 Manager,最后文件就被更新到文件库中(这动作叫做 check in),至此整个文件的修改与更新的程序就完成了。如果在 Eric 修改期间,Vivid 也拿着磁盘向 Manager 要求修改同一份文件,这时 Manager 会告诉 Vivid:这份文件目前已经由 Eric 领出(check out),且还在修改当中,你得等他改完才行喔。
以目前的作业环境来看,使用磁盘来传递档案似乎是原始人的行径,我们当然可以透过网络来传递档案,但是透过网络传递档案却无法提供上面的例子所要表达的重点:档案的锁定。而锁定机制就是 VSS(或其它版本管理工具)提供的基本功能之一,它确保了多人修改文件时,版本的一致性。上面这个例子当中的文件库,就相当于 VSS 的数据库,而 VSS 的客户端工具(称为 VSS Explorer)则扮演了 Manager 的角色。
当然 VSS 提供的功能更多,它也允许多人同时取出(check out)同一个档案进行修改,并且在将档案送回(check in)数据库时,自动进行合并(merge),这属于比较进阶的功能,稍后亦会提到。
现在你应该已经大概知道什么是 VSS 数据库、什么是 check in、check out,以及文件修改的流程了,接下来就把一些常见的 VSS 术语列出来,在阅读本文时,如果碰到不了解的术语,也可以随时回头查看。
以下是使用 VSS 时常见的术语:
术语 | 说明 |
VSS 数据库 | VSS 会使用一个数据库来储存各项目的程序 代码版本(包括历史版本和最新版本的档案)。 |
Projec | VSS 项目,是一个项目档案的逻辑结构,跟操作 系统的目录类似(注意不是指特殊开发工具的项目,例如:VB 专案)。 |
Working Folder | 客户端的项目工作目录。每次从 VSS 数据库取 出档案时,就会将档案复制客户端机器的这个目录下。 |
Master Copy | 储存在 VSS 数据库中的最新版的档案。 |
Local Copy | 储存在本机的 Working Folder 的版本。 |
Check Out | 把要修改的档案从 Master Copy 复制一份到本 机的 Working Folder 下,以便修改。 |
Check In | 本机的档案修改完后,把档案送回 VSS 数据库。 |
Get | 只从 VSS 数据库取得 Master Copy 的档案,但 是不做修改。当你要取得档案的最新版,并且只对它读取时,可使用此功能。 |
Multiple Checkouts | 一个档案同时被多人取出修改。 |
Merge | 合并 Multiple Checkouts 的修改结果。 |
Shadow Folder | 影子目录,它是一个硬盘上的实体目录,每当开 发人员 check in 档案时,VSS 就会同时将档案复制一份到这个影子目录里面。 |
2. 安装与使用范例
本节分别介绍 server 端与 client 的安装及使用。
2.1 服务器端
服务器端包含了管理工具和客户端工具的安装,相关的管理及设定工作有下列几项:
-
- 安装 VSS。
- 建立数据库(使用 Admin 管理工具)。
- 建立 user 账户(使用 Admin 管理工具)。
- 设定其它选项。
- 设定网络的共享目录。
以下是各项工作的施行细节,我们会在 D:/VSS_DB 目录下建立一个新的 VSS 数据库,如果你不想要建立数据库,也可以使用预设的数据库。
2.1.1安装 VSS
直接执行安装程序,安装过程中会有一个安装选项画面,其中有三个选项,分别为 SHARED DATABASE SERVER、CUSTOM、与 STAND-ALONE。请选择 SHARED DATABASE SERVER。
安装完成后,在〔开始/程序集〕里面会有一个 Microsoft Visual SourceSafe 数据夹,里面有四个程序快捷方式:
- Analyse & Fix VSS DB
- Analyse VSS DB
- Microsoft Visual SourceSafe 6.0
- Visual SourceSafe 6.0 Admin
2.1.2建立数据库
开启 Visual SourceSafe 6.0 Admin,如果是第一次执行,程序会提示你要设定 Admin 账号的密码,若此时不设定,以后也可以在〔Users/Change Password〕里面变更 Admin 账号的密码。
进入 VSS Admin 之后,先点选〔Tools/Create Database〕建立一个自己的数据库,建立数据库时会同时建立一个预设的管理员账户 'Admin',此账户无法删除。
一个数据库里面可以包含多个项目,当然你可以视需要建立多个数据库,只是一次只能使用一个数据库。
假设你将数据库建立在 D:/VSS_DB 目录。
2.1.3建立使用者账户
数据库建立好之后,必须先开启数据库,然后就可以为这个数据库建立 user 账号,以便日后为各个 user 赋予适当的档案存取权限。这些 user 就是开发小组的成员。
欲开启数据库,请点选〔 Users/Open SourceSafe Database〕或者按 Ctrl+O,然后选择上一个步骤建立的数据库,如下图:
如果之前建立的数据库没有显示在清单里面,请按右边的 Browse 钮找到该目录(此动作只需一次),然后按 Open 钮,即可开启数据库。
数据库开启后,点选〔Users/Add User〕或按 Ctrl+A 即可新增一名使用者。
2.1.4设定其它选项
在 VSS Admin 中点选〔Tools/Options〕即可开启选项设定窗口,其中有些设定在客户端(VSS Explorer)里面也有,而这里的设定是全域的,也就是如果客户端没有修改自己的设定,就会取用这里的设定。
建议的设定值(True/False 表示勾选/不勾选):
页夹 | 项目名称 | 设定值 |
General | Use network name for automatic user log in | True |
Project Rights | Enable Rights and Assignments commands | True |
2.1.5设定共享目录
你至少要把 server 端的两个目录分享出来给其它网络使用者存取:
1. 分享 VSS 的应用程序目录,以便客户端可以在网络上直接执行其中的 NetSetup.exe 进行安装。
2. 分享数据库所在的目录,如前面范例中的 D:/VSS_DB。
注意:
如果你在分享 VSS 的应用程序目录时,把目录权限设为「只读」的话,客户端安装完后将无法自动执行 VSS(但仍可手动执行);若目录权限为「完全控制」则不会有这个现象。
2.2 客户端
2.2.1安装客户端
安装客户端程序的方法有两种:
1. 向管理员询问服务器端的 VSS 应用程序分享目录,然后直接执行该目录下的 NetSetup.exe`.
2. 利用光盘安装,安装型态选择 "Custom",然后选择 "Client Programs"。
2.2.2开启数据库
安装完成后,执行 VSS Explorer(在「程序集」中的名称是 "Microsoft Visual SourceSafe 6.0"),第一次执行时会出现登入窗口,输入要登入的数据库名称(浏览网络上的芳邻,找到 2.1.5 节所分享出来的数据库目录),然后输入使用者名称和密码,即可登入数据库。参考下图:
VSS Admin 提供一个选项,可以在登入时自动以目前登入 Widnows 的使用者名称来登入数据库,前提是 VSS 的使用者名称要和 Windows 的使者名称相同。方法是将 VSS Admin 的〔Tools/Options〕的 "General" 页夹中的 "Use network name for automatic user login" 项目打勾。以后再次执行 VSS Explorer 时,就会自动以该使用者名称登入,而不会出现登入画面。
2.2.3建立项目
登入数据库之后,由于是第一次执行,所以没有建立任何项目,看到的画面会像下面这张图:
左边是以树状显示的项目面板,"$/" 是 VSS 的 root project,所有的项目都是建立在此节点之下;右边会显示目前的项目的档案清单;下方状态列中则显示提示讯息、目前登入的使用者名称、档案的排序方式、以及档案数量。
以下步骤示范如何建立一个项目,该项目的档案目录已经事先建立好,位置是 "D:/Projects/Demo1/",而且该目录下已经存在所有文件和程序代码档案。
1. 在项目面板中的 $/ 节点上面点一下右键,然后点选〔Create Project...〕。在接下来开启的窗口中输入项目名称 "Demo1",再按 Ok 钮即可建立项目。
2. 接着将档案加入此项目节点。做法是在项目面板中的 "Demo1" 节点点一下,然后点选〔File/Add Files...〕或按 Ctrl+A。
3. 接着将项目 Demo1 目录下,要加入版本管理的子目录加进来,例如:若要加入 Src 目录,则照下图方式操作:
注意必须双击欲加入的数据夹,使其图标变成开启的样子,才是加入该数据夹。确定之后按 "Add" 钮即可加入,加入数据夹的窗口左下角的 "Recursive" 项目通常会打勾,也就是该数据夹底下的子目录也要一并加入。
Tip: 你也可以用鼠标拖曳的方式加入档案或资料夹。
Tip: 当你在加入档案时,如果临时要取消,可以按画面方状态列最左边的〔Cancel〕钮。事实上,只要是比较花时间的工作,都会出现〔Cancel〕钮让你有机会取消工作。
4. 数据夹加入之后,程序会询问你是否要将此数据夹设定为工作目录(working folder),回答 "Yes" 即可。参考下列画面:
此对话盒关闭后即会回加入数据夹的窗口,若不需要加入其它目录,就按 "Close" 钮关闭此窗口。
5. 此时画面应会显示如下图:
注意项目面板中的节点必须设定成工作目录(working folder)才能够对该目录执行 check in/check out 动作,例如此范例中的 Demo1 节点,它是我们自行建立的逻辑项目,并未设定其工作目录(也就是没有对应到实体的目录),因此当你点选 Demo1 节点时,右边面板上方的状态会显示 "No Working Folder"。
如果你需要将 Demo1 目录底下的所有目录都纳入 VSS 管理,也可以省略步骤 1,而在步骤 2 加入档案时,直接开启 "D:/Projects/Demo1" 数据夹,这样就会连同 Demo1 这个目录一并加入,且同时为它设定工作目录。
2.2.4设定工作目录
建立项目之后,接着就是要设定工作目录。首先,在 VSS Explorer 的项目面板里面找到你的项目,在该项目上点一下鼠标右键,再点选〔Set Working Folder...〕,把目录指向你的本机硬盘的项目目录即可。只要父层的节点有设定工作目录,其下的子节点就不用再指定工作目录了。
设定好工作目录之后,就可以利用 VSS 执行 Check Out 或 Get 动作。如果你希望把整个项目的目录和档案都先从从服务器取回来,并且复制到你的工作目录下,你可以使用 Get;方法是在项目名称上点一下鼠标右键,再点选〔Get Latest Version...〕,此时会开启一个对话窗口,如下图所示:
注意左下角的 "Recursive" 项目,通常我们会希望连子目录一并取回,所以要将此项目打勾。确定之后按〔OK〕钮即可,遇到不存在的目录,VSS 会问你要不要建立,选 "Yes All" 即可,完成之后,你可以开启档案总管,看一下工作目录中的文件目录结构,如果执行的步骤正确,你需要的项目档案和目录 VSS 应该都已经帮你从服务器复制过来了。此动作并非必要,你可以等到你要读取或修改某个档案时,再去 Get 或 Check Out 该档案,到时候 VSS 一样会帮你建立必要的目录。
如果你希望每次取得(get)或 check out 档案时,"Recursive" 项目都要自动勾选,你可以在〔Tools/Options〕的 "General" 页夹更改这个预设设定,参考下图:
项目完成时,或者需要对现有版本进行建置与发行时,可以在服务器的计算机上开启 VSS Explorer,利用〔Get Lastest Version〕取得最新版本,你便可以在服务器端进行建置或者备份项目的工作;或者,你也可以透过影子目录(shadow folder)的功能,来达到相同的目的(参考 3.4 节)。
3. 其它功能
本节将介绍 VSS 的其它功能,包括:
- 多重 checkouts
- 档案的共享(Share)与分枝(Branch)
- 影子目录(Shadow Folder)
3.1 多重 checkouts
VSS 预设不允许多重 checkouts,也就是当一个档案或目录被一个使用者 check out 之后,其它使用者就不能再 check out 该档案目录。当你的小组可能为多人同时修改一个档案,或多人同时修改一个目录里面的各个档案时,可以将多重 checkouts 的功能开启。设定方法是在 VSS Admin 管理工具里面,将〔Tools/Options〕的 "General" 页夹里的 "Allow multiple checkouts" 项目打勾。
使用多重 checkouts 时,有些值得特别注意的地方,例如:一个档案由多人同修改时,VSS 将如何处理?以下将说明相关的注意事项。
文字文件 v.s. 进位档
当你开启多重 checkouts 选项时,表示有可能一个档案同时由多人修改,而 VSS 能够将这些人对同一个档案的修改结果合并(merge)起来,每当一个使用者 check in 档案时,VSS 就会自动进行 merge。也由于 VSS 提供了这项功能,因此限定只有文字文件(text files)才能够多重 checkouts,二进制档案(binary files)仍然是禁止的。VSS 会自动判断档案是属于文字文件还是二进制文件(藉由搜寻二进制的 /0x0 字符),你也可以预先指定好哪些档案类型是二进制文件,省得 VSS 还要花时间判断;方法是:开启 VSS Admin 的〔Tools/Options〕,切到 "File Types" 页夹,把二进制档案的附文件名加入 "Binary files" 字段里。参考下图:
注:所谓的文字文件,通常是指可以用记事本开启的纯文本文件,因此 WORD 文件(.DOC)档案应该归类为二进制档案。
图中的 File groups 清单里面,笔者自行加入了 Delphi 项目会用到的档案类型,这项设定是用在当你加入档案时,显示在档案类型下拉盒中,方便你挑选档案而已,如下图:
其实大部分的情况下,用预设的 "*.*" 就行了。
合并机制
当一个档案被多人 check out 时,每当有人将该档案 check in,VSS 就会自动比对档案的差异,并且合并有差异的部分。考虑下面的场景:
1. 张三与李四都 check out 了 foo.txt 这个档案。
2. 张三修改了 foo.txt 的第 100 行,并且 check in。
3. 李四修改了 foo.txt 的第 200 行,并且在 210 行的地方加入了 5 行程序代码。
4. 李四改完了,并且 check in。
上面的例子对 VSS 来说毫无困难,它会安静地自动合并张三和李四所做的修改。但不是所有情况都这么完美,万一两个人都修改了同一行程序代码,此时 VSS 就无法替你做决定,必须由你自己决定怎样合并档案。考虑下面的场景:
1. Carol 与 Michael 都把 test.txt 取出来修改。
2. Carol 修改了第 1 行,然后 check in。
3. Michael 也修改了第 1 行,然后 check in。
这时候 VSS 无法判定到底要怎么合并,于是开启窗口显示两个版本的差异,让后面 check in 的人(Michael)决定怎么合并,参考下图:
图中分为三个面板,左上角的面板是目前服务器上的版本(上一个人 check out 的版本),右上角是本地端的版本,下方面板则是合并后的版本;此时 Michael 就可以从两个版本中观察差异的部分,决定好怎么修改后,在左边或右边面板中点鼠标右键,选择〔Apply Change〕来把要改变的内容套用到下方面板。你也可以修改下方面板的文字内容,改好后按工具列的储存钮(磁盘的图标)即可。
附带一提,你可以从 VSS Explorer 显示的画面看出一个档案是否被多人取出修改。如下图的 test.txt,在文件名称的左边有两个勾勾的图示,而 User 栏则显示最后一次 check out 的使用者名称,后面加上 "..."。
值得采用吗?
万一 VSS 无法自动合并,手动合并似乎有点麻烦,这样做值得吗?还是干脆不允许多重 checkouts?
笔者的建议是,只有当你真正碰到的时候,才把这个功能打开。举例来说,在一个项目里面,可能会有一些共享的程序代码,这些共享的程序代码平时可能由一个人维护,例如:AppUtils.cpp;但是也有可能别的程序设计师写了一些共享的函式,为了避免共享的程序代码散乱在太多档案里面,于是他希望把自己写的共享函式也放到 AppUtils.cpp 里面,于是便形成了多人要维护同一个档案的情形,此时就很适合使用多重 checkouts 了,因为虽然改的是同一个档案,各人要改的部分会彼此冲突的情况不多,此时 VSS 将可以自动处理 90% 以上的合并。
3.2 档案的共享(Share)与分枝(Branch)
你可以指定一个档案让多个项目共享,方法是在 VSS Explorer 的项目面板中,挑选要共享的目录,注意不是分享出去的目录,而是指你现在想要使用别人的共享档案的那个项目目录,在该目录上点右键,再点选〔Share〕,这时候出现的窗口才是要挑选来源的共享档案,在窗口中选好要共享的档案,然后按〔Share〕即可。参考下图:
档案4.设定成共享之后,当你对共享档案 check out,不管是提供共享档案的来源项目,还是使用这些共享档案的项目,其目录下都会有一份共享档案的拷贝,但是 VSS 保证这些档案内容都会一致,VSS 透过 Share 的设定来维护各项目间共享档案的连结,让共享档案维持一个版本。
你也可以透过分枝(Branch)的功能来切断共享档案的连结,这意味着你不要再跟别人共享这个档案了,而希望保有独立发展的版本。做法是在 VSS Explorer 的右边面板中,点选要切断共享关系的档案,然后点选〔SourceSafe/Branch...〕,接着会出现窗口请你确认,按〔OK〕钮即可。切断共享关系之后,其它项目的共享关系依然存在,只有自己跟别人脱离关系而已。
3.3 影子目录(Shadow Folder)
由于所有的修改记录和最新版本的档案都存在 VSS 数据库中,如果其它人(例如:项目经理、系统分析师、建构师)经常需要读取最新版的档案,但是又不想要安装 VSS,就可以使用 Shadow Folder 功能,让这些人可以透过档案总管的方式读取档案(只能读取,不能修改)。设定 Shadow Folder 的方法是在 VSS Admin 工具中点选〔Tools/Options〕,然后切到 "Shadow Folders" 页夹,先输入要设定 shadow folder 的项目,你也可以点旁边的〔Browse〕钮,用鼠标来选择项目;接着输入影子目录的实体路径名称,设定完之后按〔确定〕钮即可。如果你要一次设定多个项目的影子目录,可以在每一个项目设定完后按〔Set Another〕钮。参考下图:
如果要取消影子目录,只要先输入项目名称,然后把 "Set shadow folder to" 这个字段清除就行了。
注意:
- 影子目录通常是服务器上的目录,建议使用 UNC 路径名称,若使用像 "C:/Projects" 之类的本机磁盘驱动器名称,则每个使用者的机器上都会维护一份 Shadow Folder 档案。
- 你必须确定每个开发人员都有权限存取影子目录,否则当他们 check in 档案时,就会出现错误。
4. 结语
最后,笔者整理出几个使用 VSS 时的重点步骤及快速键(假设数据库和使用者账户都已经建立好了):
-
- 登入 VSS 数据库,开启 VSS Explorer 时就会要求登入,也可以点选〔Files/Open SourceSafe Database...〕或按 Ctrl+P 来登入别的数据库。
- 建立项目,〔File/Create Project...〕。
- 设定工作目录,〔File/Set Working Folder...〕或按 Ctrl+D。
- 加入档案,〔File/Add Files...〕或按 Ctrl+A。
- 取出档案并修改,〔SourceSafe/Check Out〕或按 Ctrl+K。
- 修改完后送回服务器,〔SourceSafe/Check In〕或按 Ctrl+U。
其中只有最后两个步骤是开发人员经常执行的动作。
VSS 主要是依靠将档案属性设定成只读来提供档案锁定的机制,而其档案传递的途径则是透过传统的 NetBIOS 和档案共享机制,这使得 VSS 的应用范围只能限制在局域网络内,如果能透过 TCP/IP 的方式传输档案,适用的范围会更广,也会更方便 [注1]。
透过本文的介绍,笔者希望能让你对 VSS 有一个初步的了解,并且能很快地学习如何使用它,当你真正开始使用它,就会逐渐发现一些新的或者一些比较细节的东西,此时再到网络上寻找解答,这样可能会比读完很多份文件以后才开始安装使用要来得快一些。如果你要更深入了解 VSS,可以参考文后列出来的参考资料,微软网站上亦提供了相当丰富的文件,从这个网址进入: http://msdn.microsoft.com/ssafe/ ,里面有 VSS 的最新消息和大量的技术文章、教学文件,你可以从这些文件里获得对 VSS 更完整的认识,并且学习一些进阶的管理议题,例如:VSS 数据库的保全、分析、修复、与备份;VSS 的自动化(automation);与其它 IDE 工具的整合等等。在学习使用的过程中如果碰到问题,可以利用网络论坛来寻求解答,这里列出几个供读者参考:
- Visual SourceSafe Newsgroup. http://msdn.microsoft.com/newsgroups/default.asp?url=
/newsgroups/loadframes.asp?icp=msdn&slcid=us&newsgroup=microsoft.public.vstudio.sourcesafe. - Tek-Tips Forums. http://www.tek-tips.com/threadminder.cfm?SPID=722.
- CodeGuru Forums - Visual SourceSafe.http://www.codeguru.com/forum/showthread.php?threadid=252820.