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 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(); <<<<<<< netants.c return(B); ========== return(A); >>>>>>> 2.2 } …… 除非我们做出修改并删去"<<<<<<<"、"======="和">>>>>>>",否则在执行cvs commit的时候,netants.c 将不会更新原有的2.2版本。
4.CVS的其他功能
CVS当然远不止上面所说的这些内容,这些仅是CVS的基本功能,CVS还有许多重要的功能,如上面所说的网络工作方式、支持二进制文件等。下面我们对这些功能作简单的说明。