例子

作为一种介绍CVS的方式,我们将使用CVS进行一次演练(work-session)。第一个要明白的是CVS把所有的文件集中保存在一个源码库(repository)[第 2 章]中;在此我们假定已建立好一个源码库。

假定你开发的是一个简单的编译器。源文件包括几个C文件和一个Makefile。编译器叫tc(Trivial Compiler), 同时源码库已建立。因此有一个叫tc的模块。

获取源文件

首先要做的是得到一份tc源文件的工作拷贝。你需要用checkout命令:

$ cvs checkout tc

这样会创建一个名为tc的新目录并把源文件复制到这个目录中。

$ cd tc
$ ls
CVS         Makefile    backend.c   driver.c    frontend.c  parser.c

CVS目录是CVS内部使用的。正常情况下,不要改变或移动里面的任何文件。

用你的编辑器,对backend.c进行修改,几小时的优化后通过了编译器。RCS和SCCS使用者应注意:不必锁住你想编辑的文件。详细解释请参考[第 10 章]。

提交修改

当你刚用编译器检查过文件可以编译时,你却决定对backend.c做新的修改。CVS会把你的新文件保存在源码库中并且使用同一源码库的任何人也可以得到它。

$ cvs commit backend.c

CVS打开一个编辑器,让你输入一个日志信息。你敲入“Added an optimization pass.”, 保存这个临时文件,退出了编辑器。

环境变量$CVSEDITOR决定运行哪一个编辑器。如果没有设置$CVSEDITOR而设置了环境变量$EDITOR,那么就会启用后者。如果两者都未设置,那么会启用一个默认编辑器,比如在unix系统上会是vi, 在Windows NT/95系统是notepad

做为补充, cvs还会检测$VISUAL环境变量. 这取决于是否需要和以后的CVS版本是否检测$VISUAL. 不必多虑,你不设置$VISUAL或者将它与$EDITOR设成一样.

当CVS启动编辑器时,它包含了一个被修改的文件的名单。对于CVS客户,这个名单基于文件的修改时间和它最近一次被修改的时间。因此,如果一个文件的修改时间改变了而内容没有,它就好象一个修改过的文件一样。处理这种情况最简单的的办法是别管它——如果你使用提交的话,CVS会检测到它的内容没有改变,从而把它作为未改变的文件来处理。下一次update会告知CVS此文件没有修改,并会重设时间标记以便此文件不会在以后的编辑过程中出现。

如果你想避免打开一个编辑器,你可以在命令行使用-m标记来指定日志信息,如下所示:

$ cvs commit -m "Added an optimization pass" backend.c

清除

在你转到其他程序任务之前,如果要删除tc的工作拷贝,一般采用如下方法:

$ cd ..
$ rm -r tc

但是更好的方法是使用release命令[release--Indicate that a Module is no longer in use 在 附录 A]:

$ cd ..
$ cvs release -d tc
M driver.c
? tc
You have [1] altered files in this repository.
Are you sure you want to release (and delete) directory `tc': n
** `release' aborted by user choice.

release命令检查你所做的所有更改。如果打开历史纪录功能,它会同时在历史档案文件中加入一条注释。[The history file 在 附录 C]。

当你用release-d参数时,它将删除你的工作拷贝。

在以上的例子中,release命令向输出设备写了几行文字。? tc意思是CVS不认识文件tc。这一点你不需要担心。tc是一个可执行文件,它不会被存储在源码库中。关于如何消除这些警告,参见[使用 cvsignore 忽略某些文件 在 附录 C]。参见[release output 在 附录 A],可以得到release所有可能的输出。

M driver.c更严重一些。这表明driver.c这个文件在检出后已经被更改过了。

release命令通常在结尾处告诉你在工作目录有多少源件的拷贝已经被更改了,然后在删除或在历史档案中进行更改之前向你确认。

你认为安全的情况下,按n RET就可以了。

查看差异

你忘记了driver.c是否被更改,想查询一下这个文件的更改情况。

$ cd tc
$ cvs diff driver.c

这个命令diff可以检查driver.c的检出版本和工作目录中版本的差异。看到输出后要你记起增加了一个命令行选项使优化可以执行。提交之后,release这个模块。

$ cvs commit -m "Added an optimization pass" driver.c
Checking in driver.c;
/usr/local/cvsroot/tc/driver.c,v  <--  driver.c
new revision: 1.2; previous revision: 1.1
done
$ cd ..
$ cvs release -d tc
? tc
You have [0] altered files in this repository.
Are you sure you want to release (and delete) directory `tc': y