平静

遵循美德行事,纵使没有增加快乐,也可减轻焦虑。

导航

cvs 用法

Posted on 2016-10-26 14:59  mdong  阅读(471)  评论(0编辑  收藏  举报

 

CVS使用指南

1 概念

CVS是Client/Server结构的并行版本控制系统。

资源库(repository)

存在于服务器上,所有版本的数据仓库。可以把它想象成一个数据库服务器。

模块 (module)

在资源库上,被当成一个整体来维护的版本对象,一个模块由若干文件、目录组成。例如,可以把一个项目当成一个模块。模块可以被当成一个整体被导入(import)、检出(checkout)。

分支(branch)

一个模块的变化可以形成多个并行的分支。分支可以成为一棵树。分支可以看成整个模块的版本。

主分支被称作HEAD。

标记(tag)

在某一时刻,模块中所有的文件处于各自的不同版本,为了保存当前模块的状态,可以对模块做一个标记。将来可以按照这个标记检出文件。相当于一个快照。分支的形成是基于标记的。一个标记可以是分支标记。

标记是应用于文件的,当按照标记检出的时候,只有带某个标记的才被检出。

可以对模块做标记,也可对一些文件做标记。

修订版(revision)

对文件修改的版本号。用系统自动用1.2.3.6之类的来标识。

 

2 使用

2.1 登录、注销

cvs login

这时候cvs会问密码,输入密码。如果没有任何错误信息,登录成功。

成功登录后将建~/.cvspass文件,保存你的口令,以后就不用输入口令了.

cvs logout

 

2.2 检出(checkout)

cvs checkout module_name

把一个模块从服务器上检出,到本地计算机上。一个模块只需要在开始使用的时候检出一次,以后使用更新。

2.3 更新文件

cvs update filename

将文件同步到最新的版本:不指定文件名,cvs将同步所有子目录下的文件。最好每天开始工作前或将自己的工作导入到库里前都要做一次,并养成"先同步 后修改"的习惯,和Virvual SourceSafe不同,CVS里没有文件锁定的概念,所有的冲突是在commit之前解决,如果你修改过程中,有其他人修改并commit到了库中, CVS会通知你文件冲突。

2.4 提交文件

cvs commit -m "write some comments here" file_name

确认修改写入到CVS库里。如果不用写-m "comments"而直接确认`cvs commit file_name` 的话,cvs会自动调用系统缺省的文字编辑器(一般是vi)要求你写入注释。

注释的质量很重要:所以不仅必须要写,而且必须写一些比较有意义的内容:以方便其他开发人员能够很好的理解。

每次只确认一个文件到CVS库里是一个很好的习惯,但难免有时候忘了指定文件名,把多个文件以同样注释commit到CVS库里了,以下命令可以允许你修改某个文件某个版本的注释:

cvs admin -m 1.3:"write some comments here" file_name

 

2.5 查看状态

cvs status filename

状态报告,类似这样: 

File: foo.c             Status: Up-to-date 

   Working revision:    1.1.1.1 'Some Date' 

   Repository revision: 1.2     /home/cvsroot/cvstest/foo.c,v 

   Sticky Tag:          (none) 

   Sticky Date:         (none) 

   Sticky Options:      (none) 

这里最重要的就是Status栏,这里总共可能有四种状态: 

Up-to-date: 本地的文件与库一致。

Locally Modified: 本地文件比库中文件新。

Needing Patch:本地文件比库中文件旧。

Needs Merge: 本地文件和库中文件都被修改了。

 

2.6 查看修改历史和注释信息

cvs log file_name

 

2.7 添加文件和目录

cvs add new_file_name

cvs add -kb new_file_name

cvs add dir_name

CVS一般只处理文本文件,它会扩展keyword(宏)并转换行结束符。

对于图片,Word文档等非纯文本的项目,需要使用cvs add -kb选项,否则有可能出现文件被破坏的情况。

然后确认修改并注释

cvs ci -m "write some comments here"  new_file_name

 

2.8 删除文件

将某个源文件物理删除后。

cvs remove file_name

然后确认修改并注释

cvs ci -m "write some comments here" file_name

 

注意:很多cvs命令都有缩写形式:commit=>ci; update=>up; checkout=>co; remove=>rm;

 

2.9 修改文件名

移动文件/文件重命名

cvs里没有cvs move或cvs rename,因为这两个操作是先cvs remove old_file_name,然后cvs add new_file_name实现的。

 

2.10 目录结构同步

如果在你checkout后,有人添加了新的文件或目录,你需要把他们取出来。

cvs update -d

 

2.11 放弃本地的修改(undo)

如果修改来了本地文件,不想提交,想重新取新文件。

cvs update -C filename

它会先把你的本地文件改名。

 

建议:建议大家把checkout的文件缺省为readonly,把"cvs -r"添加到~/.cvsrc文件中     这样,你每次修改一个文件前,先cvs edit filename,提交后文件又变成readonly,            如果你想放弃本地的修改,则cvs unedit filename,它会undo,而且文件又变成readonly。

 

2.12 恢复到旧版本

cvs update -j1.20 -j1.15 filenames

1.20时当前版本号,注意顺序不要反了,记住要commit,为了保证是当前版本号,最好先lock。

注意:cvs update -r1.15 file.name,这里的-r不是版本号的意思,是给文件加了一个叫1.15的sticky tag

如果不小心已经加成STICK TAG的话:用cvs update -A 解决

 

2.13 文件比较

cvs diff -c filename

cvs diff -c -r1.8 -r1.5 filename

 

2.14 锁定与解锁文件

为保证串行的修改文件。

加锁:

cvs admin -l files

解锁:

cvs admin -u files

 

3 CVS宏

CVS缺省会对文件进行keyword(宏)替换,在文件中加入这些关键字是个良好的工作习惯 。

$Id$ 关键字是用文件名、版本、时间、作者 及代码性质替换,如果使用-l选项取出,在Exp后面会加上登录用户的名称。

$Log$ : 你所提供的修改日志信息。

$Author$ :存入该版本的作者。

$Locker$ : 该版本的加锁者

$State$ : 该版本的状态 Exp(试验版), Stabe(稳定版), Rel(发行版).缺省是Exp

$Date$ : 该版本存入的时间,使用UTC时间格式。

$Revision$ : 该版本的版本号

$RCSfile$ : RCS文件名

$Source$ : RCS全路径名

$Name$ : 取回该版本的符号名

$Header$ : 相当于$ Source $$ Revision$$Date$$Author $$State$$Locker$的组合

 

 

4 标签(tag)操作

4.1 对当前模块设置标签

cvs tag release_name  module_name

release_name要简洁而含义丰富,由字母开头,加字母,数字,下划线和连字号组成,特别是不能含“.”。

4.2 检出有某个标签文件

cvs checkout -r release_name module_name

4.3 合并

cvs update -A

tag标识的文件是历史文件,不能修改,这样可在本地去除这个限制,让它和当前版本合并。

 

 

5 CVS分支管理

5.1 标定里程碑

cvs tag release_1_0 prj_dir_name

 

5.2 开始一个新的里程碑:

cvs commit -r 2

标记所有文件开始进入2.x的开发

注意:CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。

 

5.3 建立分支

在开发项目的2.x版本的时候发现1.x有问题,但2.x又不敢用,则从先前标记的里程碑:release_1_0导出一个分支release_1_0_b2

cvs rtag -b -r release_1_0 release_1_0_bugfixes prj_dir_name

-r修饰的是release_1_0,-b 修饰的是release_1_0_bugfixes,cvs的版本号将变为4位,以后每分一次支,版本号增加2位

 

5.4 分支并行开发

一些人先在另外一个目录下导出release_1_0_bugfixes这个分支:解决1.0中的紧急问题,

cvs checkout -r release_1_0_bugfixes

分支是可以修改的,并自动提交到分支上去

而其他人员仍旧在项目的主干分支2.x上开发

 

5.5 tag分支

在release_1_0_bugfixes上修正错误后,标记一个1.0的错误修正版本号

cvs tag release_1_0_bugfixes_p1

 

5.6 合并分支

如果2.0认为这些错误修改在2.0里也需要,也可以在2.0的开发目录下合并release_1_0_patch_1中的修改到当前代码中:

cvs update -j release_1_0_bugfixes

 

5.7 再次合并分支

如果又发现1.x新的bug,我在分支已经修改了,并标定了release_1_0_patch_2,我们同样希望把它合并到主干上来

cvs update -j release_1_0_bugfixes_p1 -j release_1_0_bugfixes

它的意思是把release_1_0_bugfixes_p1(tag)到release_1_0_bugfixes(分支)变化了的部分合并到当前文件(主干)

否则用6步的方法,则以前合并的内容会重新合并

注意:此时我们使用第5步的结果

教训:尽早频繁的tag,但同时不能导致tag泛滥,tag在不同的分支里可以同名

 

5.8 锁定分支

cvs admin -l r_0_2

锁定r_0_2分支

cvs admin -l

锁定主分支

 

5.9 设置缺省分支

cvs admin -b r_0_2

设定r_0_2为缺省分支

cvs admin -b    

设定主分支

 

5.10 删除历史记录

如果历史文件过多,或确定有几个阶段的稳定版本,我们可以删除一些历史文件,以保证cvs的性能。

cvs admin -o rev1:rev2 filename

删除rev1到rev2的版本,含这两个版本

cvs admin -o rev1::rev2 filename

删除rev1到rev2的版本,不含这两个版本

如果省略rev1,表示删除本分支rev2之前的所有版本

如果省略rev2,表示删除本分支rev1之后的所有版本

cvs admin -o rev filename

删除rev这个版本的文件

注意:有tag的版本不能被删除,所以tag很重要,而且只能删单个文件