关键字: CVS, VSS, Version Control, Configuration management system
CVS 由于开放源代码并且完全免费赢得了很多商业软件公司的芳心,在项目开发中使用 CVS 进行版本控制。但是根据我的理解,CVS 并不适合于商业公司。
这要从 CVS 的特点说起。
CVS 最初面向开发源代码项目,提供文件的版本控制功能。这类项目的特点是:在 Internet 上面架设一台服务器,每个项目参与人员都可以从中获取最新的开发代码和文档资料。鼓励每个人开发其中任何一个功能模快,并且提交代码。这样一来,对于同一功能模快,就存在多种代码可供选择。这时候,项目负责人出面查看/比较各个人提交的代码并且采用其中之一或者在所有版本基础上提交一个改进版本。对于项目中出现的 bug, 也同样鼓励多个人同时提交不同的解决方案,由项目负责人选用最好的一个。这样做的好处在于,集中大家的智慧。并且所有人提交的代码都保存在 CVS 中,大家可以互相交流学习,共同促进提高。CVS 这种方法被成为 copy-modify-merge。
然而,商业软件公司的情况并不如此。
对于商业软件公司来说,几个人同时就同一个功能修改同一个文件,是绝对必须避免的,因为着意味着重复劳动,意味着人力成本的浪费。除非是为了进行能力测试比赛。从这一方面来说,商业软件公司所用的版本控制软件需要防止几个人同时修改同一个文件。一种基于文件锁的版本控制软件对于商业软件公司非常需要。包括 VSS 在内的几种版本控制软件提供了这种功能。 CVS 并没有提供这种功能。CVS 的拥护者包括 CVS 的开发者,将 VSS 的 lock-modify-commit 方式视为落后的开发方式,而将 CVS 的 copy-modify-merge 的工作方式视为先进的开发方式,显然是忽略了商业用户的实际特点和需求。
另外一方面,配置管理 (configuration management) 系统所管理不应该只是源代码,还应该包含开发文档资料。对于 Unix/Linux 用户来说,大部分文档资料都是文本格式的,这没有什么问题,即使有几个人同时修改,也可以通过文件比较和合并功能,合并成一个人人满意的文档,达到一个好的结果。但是对于 windows 用户来说,大部分文档资料都不是文本格式的,比如 Office 文档, Visio 文档,UML 文档,ER Win 文档等等。对于这些文档,如果有两个人同时修改同一个文件, copy-modify-merge 的工作方式并不奏效。因为这些文件并不好比较,也不好合并。在这种情况下面,只能采用其中一个人的版本,其他人的版本作废,在新版本上面再重新修改。
由于我在项目中使用 CVS 经常碰到几个人同时修改一个文档最终导致其中只有一个人的文档有用,而其他人不得不从头再来的情况。最惨的一次,三个人同时修改一个 Word 文件,整整一天,下午快下班的时候开始提交,三个人陆续提交,问题来了!因为每个人修改的地方都不连续,如果开始每个人都记录自己修改了哪个地方也好说,偏偏没有!吵了半天,让三个人打印三份,逐字比较,另外一个人记录修改,又弄了半天,才总算搞定。并且伤了和气:所有人都觉得,其他人不好说话,怎么不让着我一点?呵呵。
烦心的事情一多,我开始到处询问解决方法。
我在 google 上面搜索的时候,经常碰到文章说 copy-modify-merge 的工作方式怎么怎么好, lock 的工作方式怎么怎么不好,劝大家都用 copy-modify-merge 的工作方式,如何如何;对于寻求用 CVS 按照 lock 工作方式的人也这样相劝,大概会让提问者牙痒痒的,呵呵,我一边看一边乐。这就好像, Oracle 网站上面每年都有大量用户询问,怎么样在 Oracle 数据库里面使用自动增长字段。 Oracle 公司每年都有人耐心地回答, Oracle 的 Sequence 字段怎么怎么比自动增长字段好,劝别人忘了自动增长字段,按照 Oracle 的习惯做法来。烦不烦啊!让我看着都嫌累。加个自增长字段有什么技术难度?许多小型数据库都有,象 Access 这种 Oracle 公司看不上眼的数据库都支持。加呗!这是客户的需求哦!不重视客户需求,还想不想活啊?扯远了。
有一天我搜索到一个有用的信息,说可以通过 perl 编程,怎么怎么地修改 CVS 什么东西,就可以了,留下了几个链接,我开心地跑去倒了一杯咖啡。回来找了半天,没有找到他说的 perl 代码,差点呛住。让我失望了很长时间。
公司经常有员工内部培训。一天收到 CVS 使用培训的 email 公告信,说感兴趣的欢迎参加。想来我也是蛮感兴趣的,就参加了。培训结束后照例是学生提问。培训老师是质量部门的一个牛人, CVS 狂热者,MS 的痛恨者,曾经热情地查看 CVS 的源代码,热情地提交 bug,热情地提交 bug 修复代码,培训过程中将 VSS 隔三拉四地提出来批一通。培训结束,我问问题了,公司规定用 CVS 做项目版本控制软件,我想让 CVS 使用 lock 机制工作,不想用 copy-modify-merge 的工作方式,怎么办?牛人讲了一通 copy-modify-merge 怎么好,为何不用呢?讲得兴趣昂然,我插不上话。等他将完,我说,CVS 开发者应该考虑到使用者吧?我应该算是 CVS 的使用者,对不?牛人说算是。我为了防止几个人同时修改一个 Office 文件,避免重复劳动,算不算一个合理的用户需求呢?牛人想了一会儿说,这么说,算是一个合理的需求,不过 CVS 根本不支持这种工作模式,这个问题我回去再查查资料。我说,如果 CVS 开发者觉得 copy-modify-merge 好,没有关系,他们可以将 lock 的功能加入,让用户安装 CVS 的时候可以配置成使用 copy-modify-merge 方式还是使用强制 lock 方式,由用户决定他们的 CVS 用什么工作方式,岂不更好?牛人说,那感情好,不过现在 CVS 做不到。事情不了了之。
前不久我看了 CVS 开发的 todo list, 短期内他们并没有将强制 lock 作为一个功能进行开发的计划。