跟踪文件编辑

对于大多数开发团队,使用cvs默认的模式就可以很好地满足要求。提交修改的时候如果遇到其他人也进行了修改,他们会自行解决然后再提交。而另外一些团队倾向于需要知道哪些文件正由谁在编辑,这样如果两个人要编辑同一个文件他们可以在提交前讨论问题。本节将讨论这种协作方式,从而避免同一时间由两个开发者修改同一个文件。

开发人员最好有这样的习惯,编辑文件前先使用cvs edit (不是chmod)命令,不再使用的工作目录用cvs release(不是rm)命令来释放。cvs本身没有强制要求这样去做。

用cvs观察(watch)指定的文件

使用观察特性,首先指定那些文件需要被观察。

cvs watch on [-lR] files … 要求开发者在编辑指定的files前先执行cvs edit命令。cvs在创建工作拷贝时将这些files设成只读,并保持到开发人员运行cvs edit命令。

files包括目录名,cvs会观察源码库中对应目录里所有文件,并对后来添加的文件也默认观察;这样允许用户设置目录的通知(notification)机制。除非指定-l选项,目录里面的内容是递归处理的。如果在~/.cvsrc[默认选项与 ~/.cvsrc 文件 在 附录 A]里设置了-l选项,使用-R选项可以重新打开递归功能。

如果省略files,默认使用当前目录。

cvs watch off [-lR] files … 检出时不再设置files为只读;开发人员也就不再要使用cvs editcvs unedit命令。

处理files和选项的方法和cvs watch on相同。

使用cvs通知

你可以告诉cvs你想得到关于在一个文件上所进行操作的通知。虽然可以不用cvs watch on命令,但如果要提醒开发人员使用cvs edit命令,还是应该用cvs watch on命令。

cvs watch add [-a action] [-lR] files … 将当前用户加入到files的通知列表。

-a选项指定通知给用户的cvs事件类型。action类型可以是:

edit

另一个用户对被观察的文件使用cvs edit命令(见下文)。

commit

另一个用户提交了files的修改。

unedit

另一个用户放弃编辑文件(而不是提交修改)。有以下几种方式:

all

上面的所有事件。

none

非上面列出的事件(对cvs edit命令很有用,见下文)。

-a选项可以出现多次,也可以没有。如果省略,默认使用all

files和选项的处理方法与cvs watch on相同。

cvs watch remove [-a action] [-lR] files … 删除由cvs watch add命令确立的通知;参数与添加相同。如果使用-a 选项,只删除指定的动作。

一旦通知的条件成立,cvs会调用notify管理文件。编辑notify文件的方法与其他管理文件相同[管理文件-administrative files 在 第 2 章]。该文件也符合管理文件的语法习惯[The common syntax 在 附录 C],文件中每一行为一个正则表达式加一个要执行的命令。命令中包含%s用来替换所要通知的用户;其余的是通知需要使用的附加信息,它们作为命令的标准输入。标准用法是将放在notify文件的同一行中:

ALL mail %s -s "CVS notification"

这条命令使用电子邮件通知用户。

如果你直接使用这种方法,cvs通知的是服务器上的用户。可以写一个notify脚本将通知指向其他的地方。但为了使用方便,cvs允许给每个用户指定一个相关的地址。作法是在CVSROOT目录下创建一个users文件,每行的格式为user:value。这样通知时不是直接指向notify中的用户,而是转到value中(一般是其他的email地址)。

cvs不会对你自己做的修改进行通知。现在的检测是基于触发事件的用户名与被通知的用户名。实际上,观察特性只跟踪每个用户的编辑动作。或许分别观察每个目录会更有用,所以这方面将来也许改变。

怎样编辑一个被观察的文件

因为被观察的文件在检出时文件属性为只读,你不能直接去编辑它。将文件改成可读写并通知其他人你打算进行编辑,应使用cvs edit命令。一些系统把这一过程叫checkout,但cvs实际是获得源码的一份拷贝[获取源文件 在 第 1 章],而这些系统将此称为getfetch

cvs edit [options] files … 准备编辑工作文件files。cvs使这些files可读写,并且通知请求edit观察的用户。

cvs edit命令使用与cvs watch add同样的选项(options),并建立用户在上临时的观察。cvs将在用户使用uneditcommit命令后删除对这些files的观察。如果用户不想得到通知,可以指定-a none选项。

files和选项的处理方法与cvs watch相同。

通常在编辑修改后,你会使用cvs commit命令,这将提交你的变更并使文件恢复的通常的只读状态。如果你决定放弃修改,或者在修改前改变主意,可以使用cvs unedit命令。

cvs unedit [-lR] files … 放弃对工作文件files的修改,并将文件改回的所基于的源码库版本。cvs对请求了cvs watch onfiles修改属性为只读。并通知请求了unedit观察的用户。

files和选项的处理方法与cvs watch相同。

如果没有使用观察,unedit命令不会工作。而将文件从源码库恢复的方法是用cvs update -C file命令[update--Bring work tree in sync with repository 在 附录 A]。这两种方法不完全相同,用update还会将你上次update后的新的变更加进来。

在方式下,即使无法连到服务器也可以使用cvs editcvs unedit;而通知将在下次正常使用cvs命令时进行。

有关谁正在观察和编辑的信息

cvs watchers [-lR] files … 列出当前观察files修改的用户。该报告包括被观察的文件和观察者的邮件地址。

files和选项的处理方法与cvs watch相同。

cvs editors [-lR] files … 列出当前编辑files的用户。报告包括每个用户的邮件地址,用户开始编辑的时间,并包含该文件的机器与路径。

files和选项的处理方法与cvs watch相同。

在旧版本的CVS上使用观察

在源码库上使用观察,cvs将在源码库里创建CVS子目录,用来存储该目录的观察信息。如果在cvs1.6或者更早的cvs中使用该源码库,会得到下列错误信息(位于一行中):

cvs update: cannot open CVS/Entries for reading:
No such file or directory

然后操作中断退出。为了使用观察特性,必需将在本地和服务器上都将cvs升级。如果无法升级,使用watch offwatch remove清除所有的观察,然后cvs1.6就可以正常处理了。