然后,RCS仍存在几个重要缺陷,其中最重要的是由于使用单一目录控制与档案锁,无法让多个编程人员同时开发。因为
RCS本身不是针对网络环境的,开发者只能在RCS代码库所在的机器上工作。这些缺点后来在CVS中都得到了改进。
下面三段话摘自Dick Grune的主页:
CVS的诞生是为了方便我和我的学生Eric Baalbergen和Maarten Waage在ACK C编译器项目上协同工作,因为我们三个人的
工作日程安排大相径庭(一个是典型的朝九晚五,一个是不确定,而我只能在晚上有时间做这个项目)。这个项目从1984年6
月持续到1985年8月。我们刚开始称CVS为cmt,因为它允许我们独立地提交不同的版本(commit versions independently)。
当Baalbergen-Waage项目结束以后,我开始着手整理cmt的shell脚本,因为我发现它好像非常有用,我改称它为CVS。
我在1986年6月23日把改进后的脚本发布到了comp.sources.unix上。
1989年3月,Brian Berlinor用C语言重新设计并编写了CVS的代码。后来,Jett Polk帮助Brian完成了CVS模型设计,增加了一
些关键特性。1993年前后,Jim Kingdon最终将CVS设计成基于网络的平台,开发者们可以从Internet任何地方获得程序源代
码。
3.CVS的特点的特点
CVS使用CS结构:服务器负责存储项目的所有版本和修改历史,客户端可以连接到服务器,check out整个项目到本机,然后
在本机上进行修改,修改完成后可以存入(check in)到服务器上。通常,客户端通过LAN或Internet连接,但如果要追踪版本历
史的项目只有一位本地开发者,客户端和服务器也可以在同一台物理机器上。但如果要追踪版本历史的项目只有一位本地开发
者,服务器软件通常运行在Unix上(CVSNT可以运行在不同的Windows和Unix上,它是从CVS中分出去的另一个独立的项
目),CVS客户端一般可以在任何主流的操作系统平台运行。
多个开发者可以并行开发项目,每一个人编辑自己从服务器取出(check out)到本机的工作版本(working copy),然后把修改
的结果存入(check in)到主机。为了避免开发者做重复的工作,服务器只接收对一个文件最新版本的更新。所以,开发者应该
保证他们的工作目录经常更新,以拥有别的开发者最新的修改。整个过程可以由CVS自动完成,需要人工介入的情况只有两
种:一是存入(check in)过程中出现冲突(conflicts),一种是存入服务器上不存在的本地文件。
每当一个存入(check in)操作成功时,所以涉及到的文件的版本号会自动加1,同时CVS服务器会在日志中记录存入的日期、作
者的名字、及存入用户对于此次存入内容的描述。CVS也可以在存入(check in)时执行用户定义的外部的日志处理脚本。可以
通过CVS的loginfo文件来安装这些脚本。
客户端通常可以比较算法、请求整个修改历史,或者取出(check out)某个固定日期或版本号的历史快照。许多开源项目允许匿
名读取(anonymous read access),这个特点首先是OpenBSD拥有的。这即意味着可以使用空密码或者公开的密码从服务器取
出(check out)源码并比较版本间的差别,唯有需要存入(check in)修改部分的人拥有帐号密码。
客户端可以使用"更新"(update)命令来更新他们本地的工作目录,需要更新的文件会被自动更新,整个项目不会被重新下载。
CVS可以维护同一个项目的不同"分支"(branches)。比如一个正式版本(released version)可以形成一个分支,这个分支现在只
修正bug即可;还有一个当前正在开发的版本,可以形成另一个分支,较之前的版本有了大的改变和一些新的特征。
CVS使用delta算法来更有效的存储同一文件的不同版本。这种实现比较偏爱多行文件(通常是文本文件)。
4.CVS的术语的术语
一些相关的源码组合在一起,在CVS中称之为一个模块(module)。CVS服务器把它负责管理的模块存储在仓库(repository)
中。获得一个模块的拷贝称之为取出(check out)。被取出(check out)的文件称之为一个工作集(working copy)。对工作集所做
的修改要通过存入(commit)反映到服务器的仓库(repository)中。从仓库把最新的修改下载到本地的工作集中称之为更新
(update)。
5.CVS的目录结构的目录结构
5.1仓库(repository)的目录结构
仓库中全部目录结构完全对应于工作目录(working directory)中的目录结构。比如,假设仓库在/usr/local/HappyBirthday
下面是一个可能的目录结构
/usr
|
+--local
| |
| +--HappyBirthday
| | |
| | +--CVSROOT
| (管理文件)
|
+--conf.d
| |