CVS (Cuncurrent Versions System)是基于TCP/IP协议的版本控制工具,也是Open source界重要的开发工具之一。
它原来主要工作在UNIX平台下,现在在windows平台上也出现了很多GUI工具。
关于其由来,发展,请参阅http://www.redsaga.com/CVS_newbie_win32/www.cvshome.org。
CVS和其他大部分版本控制软件一样,是Client/Server结构的。你必须在本地为CVS repository准备好一个目录,来和服务器同步源代码。
和在Windows 开发平台中拥有很大用户群的Visual Source Safe(VSS)相比,CVS主要由两个不同之处。
一是VSS依靠服务器上的一个共享目录提供服务,每一个client必须能够访问这个共享目录。这也决定了source safe在TCP/IP环境下使用很困难。对于分布跨越数个城市甚至的工作小组来说,只有通过VPN才能够安全的访问source safe数据库。(SourceGear公司(www.sourcegear.com)发售名为SourceOffSite的商业软件包,US$239 per user,也可以为远程用户提供通过TCP/IP访问source safe数据的能力。) 而CVS依靠TCP/IP连接提供服务,所以它天生是为了在internet上协同工作而设计的。虽然基本的pserver连接安全性不是很高,但是通过使用SSH,可以获得很高的安全性。
二是CVS反对对文件上锁的机制。VSS以及其他很多传统版本控制工具要求一个文件只能有一个使用者,它必须先checkout声明编辑文件的独享权力,直到checkin为止。但是对于地理上不限制使用者位置的CVS来说,等待一个用户checkin是一件痛苦的事情,而互相沟通比一个紧密工作的团体更困难。CVS采取多个用户可以同时对一个文件进行编辑,然后commit的方式解决这个问题。假设由于沟通不足出现冲突,使用者必须手工解决冲突之后再进行commit。在这种情况下,冲突的开发者必须努力进行足够的沟通以避免再次冲突。
CVS服务器可以被配置为把commit记录自动张贴到新闻组或者开发者的email信箱中去。注意这些辅助记录将有助于开发者之间的合作。
2, repository,module
CVS服务器上,一个源代码仓库被称为一个repository,一个server上通常可以运行多个repository,每个repository都是完全独立的,可以有不同的用户列表和访问规则。在一个repository之下,文件按照module组织,每一个module相当于一个工程,大致上相当于Source safe里面的project。
VSS在你连接上服务器之后,会列出所有的project。但并不是所有的CVS server都会提供module的列表。事实上,哪些module被公开是由管理员控制的。如果你知道一个被隐藏的module的名字,你仍然可以正常的访问这个module。
3,CVSROOT
CVS依靠运行在服务器上的一个服务程序提供TCP/IP的连接。为了访问一个CVS数据库,你必须知道你所使用的协议,服务器的地址,服务器提供的Repository的名称以及你的用户名和密码。
有数种协议可供选择。Unix/Linux机器上的CVS通常使用pserver协议,这是一种不非常安全的协议,但是如果你有额外的安全要求,可以通过SSH进行增强。除此之外,NT机器还支持ntserver协议,它通过主机的NT用户表进行访问控制(但是这是在internet上不可用的方法)。kserver和gserver协议用的比较少,他们依据Kerboses提供额外的安全保护。
你有必要知道CVSROOT这个参数。CVSROOT是一个用":"开始及分隔各个部分的字符串,它包含了协议、用户名、服务器地址和repository名称。对于用户来说,CVSROOT像URL一样,是访问一个server的途径。
一个典型的CVSROOT=:perser:cao@61.155.107.187:/cvs。这里,pserver是协议名称,cao是用户id,61.155.107.187是主机ip,/cvs是repository的名字。NT主机的repository一般会采取d:/CVSROOT之类的格式。
另一个例子是:pserver:anonymous@jivesoftware.com:/cvs,这是jivesoftware公司提供的开放源代码java技术论坛的CVSROOT。
在windows下使用命令行方式,这个参数可以通过一个环境变量使用。在windows 2000/XP系统中,你可以通过在'My computer'的properties中选择advanced,然后选择'Enviroment Variables'来输入这个环境变量。
4,checkout,update
为了得到module下面的源代码,你只需要使用checkout指令。和Visual source safe不一样,checkout只是取得文件,而非锁文件。
如果你已经有了本地文件,为了和server保持同步,你需要进行update操作。update会自动把server上的新内容取到本机来,如果你本地文件进行过了改动,它会帮您做合并工作。
checkout 和 update既可以针对一个特定的文件,也可以针对一个目录或者整个module。
5, commit
如果你对本地代码做了任何修改,或者增加一个文件,删除一个文件,每当你需要把你的改变提交到server上的时候,你需要做commit动作。假设两个人都在本地修改了同一个文件,那么他们像在进行一个竞赛,如果你快,那么你赢了。后commit的人将被server拒绝,不得不合并你的修改再次提交。
commit既可以针对一个特定的文件,也可以针对一个目录或者整个module。
6, revision
Revision是指每一个文件的版本信息。当你第一次增加一个文件到repository的时候,它会有一个初始revision是1.1,以后每次提交,会增加到1.2,1.3...
在一个branch中的文件,有相对于这个branch的版本号。如果你对文件作了tag,那么你会看到revision变成1.1.1.1的形式。具体的含义我们在branch和tag的时候描述。
7,branch
Branch是一棵正常生长的代码树中的枝杈。开始的时候,任何一个module都有一个主枝被称为'HEAD'。
一个branch终要么被合并到主干中去,要么被结束。branch通常用来debug,如果这个bug被fix了,修改bug的代码应该被合并到主枝上去。一个branch也可能经历多次与主枝的合并。
8, tag
Tag用来进行标示必要的信息。当您进行一次公开发布之前,您有必要对主枝标示"release 1.0"。这样您以后可以随时回到这个版本。
//to do: 请完善这里的描述
CVS命令行
在得到CVSROOT和你的口令之后,你可以试着登陆了。
首先,由于其他所有的GUI工具都是基于CVS基本协议的,而且他们可能会提供CVS的命令行或者等价形式作为显示的一部分,所以你应该对命令行操作有所了解。如果你还没有一个cvs。exe的命令行程序,从http://www.redsaga.com/CVS_newbie_win32/www.cvsnt.org你可以得到一个cvsnt的下载连接,其中包含了一个命令行的cvs.exe程序。我们先从它开始(为了作为一个client使用,你不需要安装cvsnt的server组件)。CVSNT的cvs.exe是专门为windows编写的,你需要把cvs.exe放在你的path里面。
1.进入命令行方式。
和VSS一样,你也需要在本地有一个工作目录对应于一个repository。假设这个目录是'd:workssandbox'。请切换到这个目录。
输入"cvs"。你会看到:
这些提示信息告诉您关于cvs的基本语法。cvs后面跟着的是全局参数,然后是命令,后是命令的参数。
2.login
正确的login不会有任何输出,否则会告诉你错误原因。
cvs
3.下面我们看看这个CVS server中有哪些module。
4.假设现在我们工作的项目是projectX,下面我们需要得到它下面的全部文件。