CVS完全手册

CVS完全手册

Wikipedia,自由的百科全书

  He Wehzhu, kerlion@netease.com, created at 2003-11-5 updated at 2003-11-12
  版权声明:可以任意转载,转载时请务必标明原始出处和作者信息
  源自:http://www.chinaunix.net/jh/4/200777.html


目录 <script type="text/javascript">showTocToggle("显示","隐藏")</script> [隐藏]
[ 编辑]

概述

CVS是一个并行版本控制系统,它采用C/S模式,它的复杂度和功能性属于中等,是当今最流行的版本控制系统。它有两个基本的特点:

  • 保存修改记录:保存了所有文件的修改历史,并可以建立分支
  • 协作与并行:cvs不推荐使用lock-modify-unlock的串行的工作模式,而采用多人可以并行地修改同一个文件,而在提交时merge conflict;它更适合于大型的工作团体。

使用CVS的好处:

  • 文件集中管理,大家都可以方便的看到所有人员的最新文件,规范化了文件的管理
  • 可以查看以前任何的一个版本或修改历史
  • 可以同时维护多个版本和分支
[ 编辑]

CVS环境设置

先不要管CVS服务器的配置,我们先假设已经有一台配置好的服务器,要访问CVS,必需先设置环境变量CVSROOT CVSROOT=:pserver:user@server#port:/path/to/cvsroot

  • pserver是访问方式,口令认证的意思,这是最常用的方式,其他还有gserver,kserver,ext
  • user是CVS服务器的用户名,
  • server是CVS服务器的名称或者IP地址
  • /path/to/cvsroot是你的CVS服务器的CVSROOT目录,根据你的CVS服务器设置做修改或者询问管理员你可以把设置放到你的shell的profile里(.bash_profile,.profile等)这样就不用每次敲一长串命令了

高级功能:现在比较流行是使用ssh来加密口令和数据流
CVSROOT=:ext:user@server#port:/path/to/cvsroot
CVS_RSH=ssh
hints:
实际上没有CVSROOT也可以,你可以每次用cvs -d :pserver:user@server#port: /path/to/cvsroot来访问,而且它将忽略CVSROOT环境变量 ,也许你会笑我只有疯子才这么用,不过,cvs可以把每次使用的命令参数放到一个文件中,所以在~/.cvsrc中加入
cvs -d :pserver:user@server#port:/path/to/cvsroot
即可,它最大的好处是修改了立刻生效,而且它的优先级高于CVSROOT环境变量,到时候不要傻乎乎地来问我,我的环境变量真么不起作用了。

[ 编辑]

登录CVS服务器

$cvs login,这时候cvs会问你口令,请把你在CVS服务器上的口令敲进去
如果没有任何错误信息,恭喜你,成功了!
成功登录后将建立一个~/.cvspass文件,保存你的口令,以后就不用输入口令了.


[ 编辑]

cvs命令格式

cvs [global_opts] command [command_opts] [command_args]
Global options 属于左边cvs的,是全局的
command_opts 属于左边command的,是局部的
cvs --help-commands查看命令列表
cvs -H command/cvs -help command 查看该命令的选项
hints:如果你每次使用一些命令都带同样的参数的话,可以把它们放到~/.cvsrc文件中去
update -c
diff -c
add -kb
cvs -Q


cvs global-option comand comand-option arguments

[ 编辑]

CVS的日常使用 =

CVS使用流程

  • checkout 尽当本地没有working copy时使用
  • staus 检查服务器上是否有新版本
  • update 如果有,则用update同步文件
  • 做你自己的修改,并保证正确
  • update 看是否有人修改了你的文件
  • 如果有冲突,合并冲突
  • commit 提交你的修改,如果因为又有人提交修改而失败,回到e步
  • 回到b步
[ 编辑]
cvs checkout module_name

module_name可以暂时理解为目录名,它会在本地但前目录下建立module_name目录,在把服务器上说有
module_name目录下的文件copy到本地module_name目录下。
注意:第一次checkout后,就不是通过cvs checkout来同步文件了,而是要进入该目录下进行具体文件的版本同步(添加,修改,删除)操作。

[ 编辑]
cvs update filename

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

服务器上文件的内容
>;>;>;>;>;>;>; latest revision number in the repository

由你确认冲突内容的取舍。也可以多人协商解决,修改完成后去掉文件中的冲突标志

conflict:多人修改同一文件的同一区域这就叫冲突,它必须由人来解决,CVS不处理冲突,它只是告诉你存才冲突


[ 编辑]
cvs commit -m "write some comments here" file_name

确认修改写入到CVS库里。
注意:CVS的很多动作都是通过cvs commit进行最后确认并修改的,最好每次只修改一个文件。在确认的前,还需要用户填写修改注释,以帮助其他开发人员了解修改的原因。如果不用写-m "comments"而直接确认`cvs commit file_name` 的话,cvs会自动调用系统缺省的文字编辑器(一般是vi)要求你写入注释。
注释的质量很重要:所以不仅必须要写,而且必须写一些比较有意义的内容:以方便其他开发人员能够很好的理解
不好的注释,很难让其他的开发人员快速的理解:比如: -m "bug fixed" 甚至 -m ""
好的注释,甚至可以用中文: -m "在用户注册过程中加入了Email地址校验"

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

[ 编辑]
查看状态

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: 表明你曾经修改该文件,但是偏偏有个不识相的也修改了这个文件,而且还提交了!

[ 编辑]
查看修改历史和注释信息

cvs log file_name

[ 编辑]

其他常用命令

[ 编辑]
添加文件和目录

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

[ 编辑]
删除文件

将某个源文件物理删除后
cvs remove file_name
然后确认修改并注释
cvs ci -m "write some comments here" file_name

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

[ 编辑]
修改文件名

移动文件:文件重命名
cvs里没有cvs move或cvs rename,因为这两个操作是先cvs remove old_file_name,然后cvs add
new_file_name实现的。

[ 编辑]
目录结构同步

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

[ 编辑]
放弃本地的修改(undo)

如果修改来了本地文件,不想提交,想重新取新文件
cvs update -C filename
它会先把你的本地文件改名

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

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 解决

[ 编辑]
文件比较

cvs diff -c filename
cvs diff -c -r1.8 -r 1.5 filename

[ 编辑]
锁定与解锁文件

为保证串行的修改文件,或修改二
cvs admin -l files
cvs admin -u files

[ 编辑]

CVS宏/keyword

CVS缺省会对文件进行keyword(宏)替换,在文件中加入这些关键字是个良好的工作习惯
$Id$ 关键字是用文件名、版本、时间、作者 及代码性质替换,如果使用-l选项取出,在Exp后
面会加上登录用户的名称。除了$Id$关键字,RCS还支持下面常用的关键字:
$Log$ : 你所提供的修改日志信息。
$Author$ :存入该版本的作者。
$Locker$ : 该版本的加锁者
$State$ : 该版本的状态 Exp(试验版), Stabe(稳定版), Rel(发行版).缺省是Exp
$Date$ : 该版本存入的时间,使用UTC时间格式。
$Revision$ : 该版本的版本号
$RCSfile$ : RCS文件名
$Source$ : RCS全路径名
$Name$ : 取回该版本的符号名
$Header$ : 相当于$ Source $$ Revision$$Date$$Author $$State$$Locker$的组合


[ 编辑]

Sticky Tag

tag的作用是对多个连续变化的文件做一个快照来表示某一时刻的所有不停内部版本的文件,一般是项目到一定阶段,可以给所有文件统一指定一个阶段里程碑版本号,需要的时候可以一次导出这些版本不一的文件.标记的另外一个非常重要的作用是生成分支和合并分支.

  • cvs tag release_name module_name

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

  • cvs checkout -r release_name module_name

取出tag_name标志的文件

  • cvs update -A

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

[ 编辑]

CVS分支管理

CVS可以将历史划分成多个独立,并行和互不影响的分支,并去修改历史

[ 编辑]
标定里程碑

cvs tag release_1_0 prj_dir_name

[ 编辑]
开始一个新的里程碑

cvs commit -r 2
标记所有文件开始进入2.x的开发
注意:CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。

[ 编辑]
建立分支

在开发项目的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位

[ 编辑]
分支并行开发

一些人先在另外一个目录下导出release_1_0_bugfixes这个分支:解决1.0中的紧急问题,
cvs checkout -r release_1_0_bugfixes
分支是可以修改的,并自动提交到分支上去
而其他人员仍旧在项目的主干分支2.x上开发

[ 编辑]
tag分支

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

[ 编辑]
合并分支

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

[ 编辑]
再次合并分支

如果又发现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在不同的分支里可以同名

[ 编辑]
锁定分支

cvs admin -l r_0_2 锁定r_0_2分支
cvs admin -l 锁定主分支

[ 编辑]
设置缺省分支

cvs admin -b r_0_2 设定r_0_2为缺省分支
cvs admin -b 设定主分支

[ 编辑]
删除历史记录

如果历史文件过多,或确定有几个阶段的稳定版本,我们可以删除一些历史文件,以保证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很重要,而且只能删单个文件

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值