入一些说明信息它才罢休。netants是这个项目被CVS存储时的路径名,即CVS将在创建一个$CVSROOT/netants的目录,并在此目录下存放此项目的文件,当然,它不是原封不动的存储,CVS会做一番处理。最后两个字符串设定了两个标记(tag),现在并没有什么用处,但它们同样是CVS指定必需的,所以我们添上这两个参数。执行此命令时,CVS自动将所有的文件版本设为1.1,这是它所认为的最低版本。以下为执行上述命令后的显示信息:N netants/netants.c N netants/http.c N netants/http.h N netants/netants.h N netants/Makefile No conflicts created by this import N表示New,CVS成功的加载了这些文件,并没有发现冲突。 上面的命令稍长了一些,而且显得有些繁琐,相信我,CVS不总是这样的,这点\"繁琐\"相对它给我们带来的便利是完全可以忽略不计的。
3.3从CVS中导出项目
好了,我们把自己的netants的项目交给了CVS去管理,现在,我们完全可以删除原有的存储我们代码的netants目录(当然,安全起见,你或许应该再做一次备份,并希望是最后一次)。我们要进行开发工作了,建一个目录,叫什么呢,就叫worktmp吧。我们进到此目录下,执行命令cvs checkout netants,我们将会看到如下的信息:cvs checkout: Updating netants U netants/Makefile U netants/http.c U netants/http.h U netants/netants.c U netants/netants.h CVS在当前目录下建立一个叫做netants的目录,我们原先的代码文件都在这个目录下出现了,而且还多了一个名为CVS的目录。目录CVS下面存放的是一些文本文件,记录了CVSROOT的位置、此项目对应源码库中那个目录等一些信息。
3.4保存修改到CVS中
现在,我们开始艰苦卓越的编程工作。经过数十分钟、数小时乃至数天的工作,我们对原有的代码做了较大的修改,现在要告一段落了。我们将修改的内容提交给CVS,于是,我们需要执行命令 cvs commit -m \"Made some useful changes on some files\" 这时,我们将会看到CVS给出一些提示信息,它扫描并比较此目录下的现有文件和它在源码库中保存的原有文件,做了修改的文件将被更新,并且有了新的版本号:1.2。-m参数如同前面所说,是为了不想它启动一个文本编辑器来让自己输入。如果我们仅是修改了其中一两个文件,我们可以在上面的命令的最后附上文件名,这样CVS只会比较、更新指定的文件。注意的是,和自己做备份不同,CVS只是保存了不同版本之间的差异,并没有完整的保存各个版本。现在,你是不是觉得CVS有点用处了。
3.5添加文件到项目中
有一天,我们开始考虑给我们的网络蚂蚁加上从ftp站点下载文件的功能,于是,我们需要在原有的项目里添加两个文件:ftp.c和ftp.h。首先,我们在工作目录下建立并编辑、修改、生成了这两个文件,然后我们使用命令add命令来添加。 cvs add ftp.c ftp.h 此时,文件并没有真正的被添加,只是相当于\"注册\"了一下,要使这个过程生效,我们仍然需要使用commit命令: cvs commit ftp.c ftp.h -m \"Add two files: ftp.c and ftp.h\" 此时,CVS将把这两个文件添加到项目中去,他们的版本均为初始的1.1。
3.6从项目中删除文件
除了添加以外,我们有的时候可能需要删除某个文件,例如我们发现文件netants.h其实没有什么用。于是,我们执行下面几个命令来完成删除工作: rm netants.h cvs remove netants.h cvs commit netants.h -m \"Delete a file.\" 要注意的是,CVS只是删除了当前版本的netants.h,它以前的版本依然存在,除非它恰好仅有1.1版本。
3.7设定特定版本号
经过一段时间的工作,程序已经初具规模,形成了较稳定的版本。这个时候,netants.c可能已经是5.4版本,而http.c可能是3.5版本,而我们希望将当前的代码作一个版本发布。此时,我们需要使用的是tag命令。这个命令赋予指定的一个或多个文件一个给定的文本形式的版本号。版本号必须以字母开始,可以包含数字、下划线和连接符号(-)。我们想给当前项目的所有文件赋予相同的版本号时,可以不指定文件或路径参数,CVS默认选择当前目录下所有在CVS中注册的文件(循环进子目录)。下面既是一个例子: 键入命令:cvs tag release0-1 提示信息: cvs tag: Tagging . T Makefile T [Page]ftp.c T ftp.h T http.c T http.h T netants.c 这样当前版本的所有文件都有了一个叫做release0-1的版本代号。当我们需要这个版本的时候,我们使用-r (版本代号)参数来得到指定的版本。例如命令: cvs checkout -r release0-1 netants 将在当前目录下建立netants目录,并导出所有版本代号为release0-1的文件。
3.8更新当前工作目录中的文件
这里使用的命令为update,它将比较指定的在CVS源码库中的文件和当前目录下的文件,如果CVS源码库中有更高版本的源文件,则更新当前目录下的文件。这个功能主要是多人协作开发项目时使用的,让你及时分享同伴的工作成果。但它另外一个重要的用途,同样适用于单人开发的项目。这个用途需要使用-j参数,我们看下面的例子: cvs update -j 1.5 -j 1.3 netants.c 这个命令的功能是,在当前目录的netants.c文件中,忽略从版本1.3到版本1.5所作的修改。毫无疑问,对程序员来说,这是一个非常重要的功能。因为在某个阶段我们对程序所作的修改在现在可能会被视为是无效乃至错误的,这个功能很好的解决了这个问题。 在更新的过程中,CVS执行一个自动合并的过程。例如我们的工作目录中的netants.c文件版本是2.1,并且我们已经对此文件作了一番修改,而CVS源码库中的是版本2.2,此时我们执行update命令时,CVS并不是简单的将版本2.2覆盖版本2.1,而是试图将自版本2.1到版本2.2的修改添加到当前目录中的文件中去,如果它和我们刚刚所作的修改有冲突,则CVS会以字符串\">>>>\"表示由冲突发生,期待用户去修改。CVS拒绝接受包含有上述特定字符串的文件。下面即是一个冲突的例子:netants.c:版本号2.2,保存在CVS中……getPartFile( ); showFinished(); return(A); }……
netants:版本号2.1经过我们的修改……getPartFile( ); return(B); }……我们执行命令cvs update netants.c后,将会包含如下内容的新的netants.c:
……getPartFile( ); showFinished(); >>>>>> 2.2 }…… 除非我们做出修改并删去\">>>>>>\",否则在执行cvs commit的时候,netants.c将不会更新原有的2.2版本。
4.CVS的其他功能
CVS当然远不止上面所说的这些内容,这些仅是CVS的基本功能,CVS还有许多重要的功能,如上面所说的网络工作方式、支持二进制文件等。下面我们对这些功能作简单的说明。4.1 CVS的网络工作方式
CVS的网络功能采用client-server结构,两地均需安装CVS。CVS采用rsh方式或者口令校验方式进行工作。对client端,同前面讲过的设置环境变量CVSROOT一样,用户需要设置新的环境变量CVS_SERVER,指明CVS在server上的路径,例如:/usr/local/cvsroot1。CVS的-d参数指定路径名,它后面可以用:(local或server或ext):来指明是在本地还是在异地服务器上,默认当然是在本地,正如我们在初始化CVS一节所使用的那样。下面的命令假定我们的CVS服务器为cvs.rdcps.ac.cn,用户名为crazyyao,CVS源码库在服务器的/usr/local/cvsroot1目录下,我们的工作项目还是netants,我们用rsh方式导出项目文件: cvs -d : server : [Page]crazyyao@cvs.rdcps.ac.cn :/usr/local/cvsroot1 checkout netants 采用口令校验方式时,需要对修改系统文件/etc/inetd.conf,以便使inetd知道如何分配、处理CVS Server的请求和响应。CVS会在源码库所在的目录中创建一个名为passwd的口令文件,对用户进行校验。使用口令校验时,CVS支持匿名登陆,而且CVS项目超级用户可以设置项目中文件的存取权限。 关于如何配置CVS使之工作在网络方式下的详细信息请参考CVS的文档。
4.2 CVS的分支和融合功能
CVS增强的目录工作方式使得CVS提供分支和融合功能。有的时候,当项目进展到一定程度时,可能需要暂时中断,去做另外一些修改和发展。例如,我们的软件原有版本为1.0,并已提交用户使用,现在正在开发2.0。某一天,1.0的用户发现了一个较大的bug或者需要添加某个短小的功能,这时我们不能让用户去期待2.0版本,又必须给用户满意的答复,比较理想的解决方式是把现在的工作先放到一边,另开一个分支,去满足用户的需要。当此分支完成后,程序源还可以使用CVS的融合功能将这一部分修改添加到我们开发2.0版本的主工作进程中去。 创建分支可以使用tag -b命令。例如下面的命令 cvs tag -b netants-1-0-patch 在当前的工作目录的基础上创建一个叫做netant-1-0-patch的分支。 融合的命令参数是-j,我们在前面已经提及它了。
4.3 CVS处理二进制文件的功能
CVS可以保存二进制文件,但和文本文件相比,它的许多功能丧失了。对于文本文件,CVS可以辨别出文件的任何一点改动,但对于二进制文件它无能为力。但是,CVS可以区分出文件作了改动,并会提示用户自己修改、保存。与文本文件不同,CVS保存二进制文件每个版本的完整信息。在操作二进制文件时,需要添加参数-KB,以便告诉CVS不把它当作文本文件看待。
4.4 CVS比较文件的功能
执行的命令为diff,这个功能和shell下的diff功能基本一样。例如下面的命令比较CVS源码库中的最新的netants.c文件和当前目录下netants.c文件有什么不同: cvs diff netatns.c
5.结束语
通过上面的介绍,希望能激起大家使用CVS的兴趣,并掌握使用CVS的一些基本方法。碰到困难时,别忘了翻阅CVS附带的手册,不过,它有厚厚的172页。希望CVS能加速你的软件开发。
文章来源于领测软件测试网 https://www.ltesting.net/