CVS 使用经验小结

基本使用方式

CVS的原始形式是单纯的cvs.exe, 该程序既是服务端也是客户端。
服务端启动cvs.exe开放cvs服务端口,
而客户端使用cvs命令行连接服务端使用cvs服务。

常见前台

服务端

服务端直接使用cvs.exe即可开启服务,无须前台。
不过windows平台上大多使用带用户界面的CVSNT。

客户端

1. windows平台

最流行的前台是WinCVS,提供独立的用户界面,功能强大,且可通过Tcl或Python脚本扩展功能。

还有TortoiseCVS, 其特色是没有单独的用户界面,而是集成在explorer里面。

另外,最近不少的IDE工具中也集成了CVS功能,比如Ecclipse, 还有 UltraEdit.
而VC当中使用的是微软自己的VCS系统SCC,不过有些插件(例如 PushOK)可以将其转向CVS接口,使得用户可以在VC中使用CVS.

2. linux 平台

大多使用cvs命令行形式.

常见的前台是 Cervisia (KDE组件之一),其特点类似于TortoiseCVS,集成在
KDE的Konquer中(类似windows上的explorer).

另外,WinCVS也推出了一个linux版本,叫 gCVS ,不过界面功能远不及WinCVS丰富,有待进一步移植.

CVS 要点说明

bin/text模式

默认的text模式会比较版本间的差异,只记录下差异部分.针对text模式的每个操作,CVS都会去比较不同版本间,或者服务器与本地文件间的差异.而bin模式不作比较.

一般根据文件本身是否为文本方式选择这2个模式.
但对于比较大的文件,即使是文本,如果设为text模式,则每次操作,CVS都会在差异比较上耗费很长时间.对于更新操作,删除本地文件后再更新会快得多.如果不需要差异比较的话(大多数情况下并不需要),可以bin模式上传该文件,从而大大加速处理时间.

Keyword Substitution

开发人员一般习惯在文件头或文件尾的地方记录下文件的修改时间,作者,版本,修改历史记录等等信息,而手动维护这些比较繁琐.CVS系统中已经清楚地记录了这些信息,所以其提供了Keyword substitution功能自动完成这一任务.

用户在文件中使用特定的一些关键字,则在上传该文件时,CVS会自动将其替换为系统中记录的信息,比如用户文件中的$Author$在上传时会被自动修改为$Author: <yourname>$.

关键字的形式是$<keyword>$,上传时转换为$<keyword>:<cvsinfo>$

不过$log$关键字比较特殊,cvs会将版本信息插入$log$之后,这样,每次上传都会留下一条记录,从而形成修改历史记录.

这是我常用的

文件头

<Copyright info...>
$source$
$Author$
$Date$
$Revision$
(Tag) $Name$
note:

文件尾 (修改记录时间久了会很长,每次看文件都要拉很久才能看到源码,有碍观瞻,所以放在尾部)

$Header$
History:
    $log$

时间

也许是考虑到会有不同时区的人参与同一个项目开发,所有CVS中的时间记录使用了UTC(标准时间).这一时间比中国的东8时区要慢8个小时.如果希望查看的是本地时间,可以在 log 时使用-t选项将UTC转换至本地时间.不过对于Keyword Sustitution功能,其$Date$只能是 UTC.

服务端外部调用接口

cvs在每个库的CVSROOT下提供了一些文件,用户可以在这些文件中针对不同的模块或不同的cvs操作定义一些命令.之后用户通过cvs执行某个操作时,cvs服务端会自动将这些用户命令传给shell执行.

这些命令文件中最常用的是loginfo,这个文件在用户提交文件时会自动执行.具体使用见文件内的说明.

另外,这些文件本身也是由cvs管理的,最好通过cvs客户端进行修改,否则如果直接在服务器上编辑的话,有可能在特定时间会被恢复到原始版本.

在调用过程中,cvs传给用户的信息有旧版本%v,新版本%V(版本可能为NONE),以及文件说明%s.
这些参数合在一起格式为

dir1 file1,oldV,newV file2,oldV,newV

如果还需要其他信息,例如用户说明,可以通过文件名找到相应的记录文件<filename>.v,从其中可以取出关于该文件的所有信息.分析出消息后,可以记录为文件,或者发送email,或者即时通信软件等方式发出通知.这些处理一般需要写个程序或脚本来实现.

tag

分为普通的tag和rtag(release tag).

普通的tag针对本地文件的当前版本打tag,而release针对服务器上的最新版本打tag.

branch

有时针对某个目录开了一个branch,后来针对某个文件作些修改,但发现该文件还不到必须分拆为2个版本的时候,可因为已经分成了 branch,你必须分别对2个branch执行同样的修改.解决办法是,使用cvs的delete branch功能针对这个文件删除branch后再作修改.由于delete branch功能cvs并不推荐,所以最好在文件必须分为2个版本的时候再针对该文件设定branch.而在按branch tag针对目录更新时,选上"未找到tag则使用最新版本"即可.

另外,branch中的每个分支最好单独checkout到不同的目录,这样可以同时维护不同分支,而不需要在同一个目录下对不同分支频繁地切换.

WinCVS使用

output窗口

不仅可以看cvs的命令输出,也可以在output窗口直接输入cvs命令,或者也可以通过Admin菜单下的CommandLine项输入.

tag bug

WinCVS的2.0以前的版本(具体版本号记不得了) 在打上本地tag后, 不能针对目录以该tag更新. 只有rtag才能针对目录更新.
之前版本没有这个问题.应该是个bug.

ChangeLog

WinCVS有个macro可以针对某个目录生成按日期排列的ChangeLog,很方便!

评论


rating: 0+x

Add a New Comment
or Sign in as Wikidot user
(will not be published)
- +
cvs
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.