cvs常用命令介绍

http://blog.csdn.net/geekwang/article/details/2898900


1.        CVS 简介

CVS (Concurrent Versions System)是一个版本控制系统。使用它,你可以记录下你的源文件的历史。例如:修改软件时可能会产生一些bug,而且可能过了很久你才会察觉到它们的存在。有了CVS,你可以很容易地恢复旧版本,并从中看出到底是哪个修改导致了这个bug 。有时这是很有用的。当然了,你可能把所有版本的所有文件都保存了下来。但这会浪费大量的磁盘空间。而CVS用一种聪明的办法来保存一个文件的所有版本——仅仅保存不同版本之间的区别——在一个文件里。如果你是项目开发组的一员,CVS也会帮助你。除非极为小心,成员之间很容易互相覆盖文件。一些编辑器,如GNU Emacs,会保证同一时间内同一文件绝不会被两个人修改。不幸的是,如果有人用了另外的编辑器,这种保护就没用了。CVS用隔离开不同的开发者解决了这个问题。每个开发者在他自己的目录里工作,等每一个开发者都完成了他们自己的工作后,CVS会将它们合并到一起。CVS最初由Dick Grune在1986年12月以shell scripts的形式发布在comp.sources.unix的新闻组第6卷里。虽然当前的CVS中没什么代码来自于这些shell scripts,但许多CVS的冲突解决算法是从它们来的。1989年4月,BrianBerliner设计了CVS并编写了代码,之后Jeff Polk帮助Brian设计了CVS模块发行分支。

CVS 是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。工作模式如下:

CVS 服务器(文件版本库)

/ | /

(版本 同 步)

/ | /

开发者1 开发者2 开发者3

2.        设置 CVS 客户端

如果不是在 CVS 服务器本地工作,则需要远程访问 CVS 服务器,这就需要对 CVS 客户端进行设置。

下面就讲讲如何远程访问 CVS 服务器。

首先要在 CVS 服务器上开设用户帐号,并加入 casic 组,这个帐号可以向 CVS 管理员申请开设。这里申请假设开设了帐号 ynding 。给帐号 ynding 设置环境变量 CVSROOT 的值为 /home/casic/cvsroot ,这样,在 CVS本地机上帐号 ynding 就可以访问 CVS 库了。

在远程机器上也建立帐号 ynding (当然也可以是其他帐号,开发时为了不混淆,取相同的帐号名为好),也给该 ynding 设置环境变量 CVSROOT :

setenvCVSROOT :pserver:ynding@192.168.0.148:/home/casic/cvsroot

或者

exportCVSROOT=:pserver:ynding@192.168.0.148:/home/casic/cvsroot

对环境变量的设置可在设置环境的文件里进行,这个请参照附录。

       设置完环境变量并让它起作用以后,就可以远程访问 CVS 服务器了。

先要登录到 CVS 服务器上:

cvs login

会提示输入密码,输入帐号 ynding 在 CVS 服务器上的密码,就能登录成功了。以后的对 CVS 服务器的操作跟在 CVS 服务器本地操作一样。完事以后,记得使用命令 cvs logout 退出 CVS 服务器。

3.        常用命令预览

1)        cvslogin

2)        cvscheckout / cvs co

3)        cvsupdate / cvs up

4)        cvscommit / cvs ci

5)        cvsadmin

6)        cvsadd

7)        cvsremove / cvs rm

8)        cvslog

9)        cvshistory

10)     cvsstatus / cvs st

11)     cvsdiff

12)     cvsexport

13)     cvslogout

4.        常用命令解释

现在 CVS 源码库中有一个目录 pub ,专门用来让大家熟悉 cvs 命令,大家可以随意在这个目录下练习使用cvs 命令。

1)        cvslogin

当要远程访问 CVS 服务器时,首先需要登陆 CVS 服务器。在拥有 CVS 服务器帐号并设置好 CVS 客户端的情况下,可以使用该命令登录 CVS 服务器,执行该命令后会提示输入密码。

至于客户端怎么设置,请参考文档《 CVS 服务器管理》。

2)        cvscheckout / cvs co

该命令用来从 CVS 库中提取源文件。

提取源文件的时候,可以整个项目同时提取,或只提取项目中的一个子目录,或者就是单个的源文件。下面看提取的 3 种情况:

       cvsco pub

       cvsco pub/testdir1

       cvsco pub/testdir1/test1.txt

              这里我们把整个 pub 目录提取出来:

                     cvsco pub

3)        cvsupdate / cvs up

将文件同步到最新版本。

同步有以下几种情况:

a)         后面不带文件名

将同步当前目录下的所有文件和子目录。

b)        后面跟一个或几个文件名

将只同步指定的文件。

c)        后面跟目录

将同步该目录下的所有文件和子目录。

              下面再介绍一下后面只跟一个文件名的情况,其他情况类同:

1)        如果该文件的版本比库里的版本低,且该文件在提取之后在当前目录下没有被改动过,则该命令会将其更新到最新版本。

2)        如果版本比库里低,而且被改动过,使用该命令后将提示版本不一样,将合并两个不同版本到最新版本。这种情况很容易出现冲突,而且即使没有发现冲突合并成功,合并的结果也不一定是你想要的。所以我们不提倡在这种情况下提交文件,应该先检查一下文件的状态再作决定如何做,至于如何检查,下面会有描述。

3)        版本跟库里一样,且文件改动过,则该命令什么也不做,在提示中文件的前面加 M 标记,表示可以提交了。

4)        版本跟库里一样,而且没有改动,则该命令什么也不做,甚至没有任何提示。

4)        cvscommit / cvs ci

提交文件,确认修改写入 CVS 库里。

前面的 cvs update 命令并不能将修改写人 CVS 库了,在 cvsupdate 成功过后,在通过 cvs ci 命令将修改写入 CVS 库里。命令格式:

       cvsci –m “modify it to demo this command” filename

其中 -m 后面是这次修改的注释,阐述修改的地方和原因,尽量能反映此次改动,为以后跟踪改动提供方面。如果不加 -m ,则会打开一个默认文本编辑器(通常是 vi )让你编辑注释。

5)        cvsadmin

常用来恢复错误操作。

具体使用将在其他地方有所阐述。例如,如果在提交文件的时候,或对某文件的某一个版本的注释不满意,决定修改它,可以运行命令:

       cvsadmin –m 1.2:”give a new comment” filename

6)        cvsadd

添加文件或目录。

添加文件的时候,将文件拷贝到当前目录下,运行命令:

       cvsadd filename

              为了添加成功,还必须使用 cvs ci 命令来确认添加:

                     cvsci –m “add a file for test” filename

如果要添加的是二进制文件,要以二进制的方式加入,否则可能会出现文件破坏的情况:

                     cvsadd –kb newfile.gif

                     cvsadd –kb readme.doc

添加目录的时候,只能添加空目录,目录下的文件还得进入该目录下继续添加,添加目录的时候不需要cvs ci 确认,运行下列命令即可:

                     cvsadd dir

7)        cvsremove / cvs rm

删除文件。

运行命令:

       cvsrm filename

       cvsci –m “reason for deleting this file” filename

在 cvs 里面不能删除一个目录,要删除一个目录,只要把它的里面的文件删除就行了。不过下次提取的时候删除的目录还会被提取出来,只不过是个空目录而已,这样比较麻烦,所以在 CVS 库里建立目录要非常谨慎。如果觉得这些空目录实在碍眼的话,可以使用命令: cvs update –P 将空目录删除。或在提取的时候使用 -P 选项:

cvs co –Pproject_name

如果你想保留某个目录来存放文件,最好在该目录下存放一个文件,例如 .keepme ,这样,该目录就不会被 -P 选项删除了。

8)        cvslog

打印出文件的修改历史,从创建到现在。命令:

       cvslog filename

9)        cvshistory

打印修改历史。命令:

       cvshistory filename

10)     cvsstatus / cvs st

查询当前文件的状态,包括当前的版本号,还有库里的版本号。

运行命令:

       cvsst test1.txt

运行结果:

       File:test1.txt         Status:Up-to-date

 

   Workingrevision:    1.3     FriAug  1 03:20:42 2003

   Repositoryrevision:1.3     /home/casic/cvsroot/pub/testdir1/test1.txt,v

   StickyTag:          (none)

   StickyDate:         (none)

   StickyOptions:      (none)

其中 Status 一栏为 Up-to-date ,表示当前文件和库里的一样。

状态还可能为以下几个:

                     LocallyModified:

你修改了文件,并且还没有提交。

LocallyAdded:

使用 cvs add 命令添加了该文件,但没有完成提交。

LocallyRemoved:

                            使用 cvs remove 命令删除了该文件,但没有完成提交。

NeedsCheckout:

       当前目录没有该文件,而库里有。

你可以使用 cvs update 命令更新到最新版本。

NeedsPatch:

当前目录的文件版本比库里低,且该文件没有被修改过。

你可以使用 cvs update 命令自动更新该文件。

NeedsMerge:

       当前目录的这个文件版本比库里低,且该文件被修改过。

你可以使用 cvs update 命令自动合并该文件,然后提交。

但不提倡这样做,应该这样,先把该文件改名,然后使用 cvs update 将最新的版本提取出来,然后将你的改动加进去再提交。

File hadconficts on merge:

当文件的状态为 Needs Merge 的时候,你使用 cvs update 命令去合并它,结果出现冲突,合并失败,你再查该文件的状态,其状态就是 File had conficts onmerge 。

Unknown:

cvs 不能识别该文件,例如你创建了该文件,但没有使用但没有执行过 cvs add 命令。

 

使用 -v 选项还可以看出这个文件处于哪些分支内:

       cvsst –v test1.txt

结果:

       File:test1.txt         Status:Up-to-date

 

   Workingrevision:    1.4     FriAug  1 03:37:13 2003

   Repositoryrevision:1.4     /home/casic/cvsroot/pub/testdir1/test1.txt,v

   StickyTag:          (none)

   StickyDate:         (none)

   StickyOptions:      (none)

 

   ExistingTags:

        release_08_03_pub_patch_2       (branch:1.4.4)

        release_08_03_pub_patches       (branch:1.4.2)

        release_08_03_pub               (revision:1.4)

11)     cvsdiff

查看文件的区别。

查看当前文件不同版本之间的区别:

       cvsdiff –r 1.3 –r 1.5 filename

查看当前文件和库里的最新版本的区别:

       cvsdiff filename

12)     cvsexport

导出不带 CVS 目录的源代码文件目录树。

       cvsexport project_name

13)     cvslogout

在客户端对 CVS 服务器访问完毕,使用该命令退出服务器。

5.     常见操作

1)        通过 cvs 恢复旧版本

如果使用命令

cvsupdate –r 1.2 filename

这个命令会给 filename 加上一个 Sticky Tag:”1.2” ,虽然你的本意是想把它恢复导 1.2 版本。正确的做法是:

       cvsupdate –p –r 1.2 filename > filename

然后再将 filename 提交。如果不小心已经加成了 Sticky Tag 的话,可以使用命令

       cvsupdate –A filename

将其恢复到最新版本,然后再采用上面的方面将其恢复为旧版本。

2)        移动文件 / 文件重命名

cvs 里没有 cvs move 或 cvs rename 命令,想要实现该功能可以通过两步来实现:

       cvsrm old_filename

       cvsadd new_filename

当然了,每一步都要通过 cvs ci 确认。

3)        删除 / 移动目录

对于删除目录,在上面讲解命令的时候已经讲到过了;至于要移动目录,还是请 CVS 管理员帮你为好。

4)        提取以前版本的项目或分支

首先讲讲怎么样提取以前的版本的项目。通常并不按照版本来提取一个项目,一般是按照时间来的。例如,我要提取 2 个小时以前的项目,可以这样提取:

       cvsco –D “2 hours ago” project_name

这样, 2 个小时前的项目就被提取出来了。最通常使用的时间格式是:

       cvsco –D “2003-08-01 10:00:00” project_name

cvs 支持的时间格式很多,还有以下几种:

1 monthago

2 hoursago

400000seconds ago

last year

lastMonday

yesterday

afortnight ago

3/31/9210:00:07 PST

January23, 1987 10:05pm

22:00 GMT

中间有空格符或其他分隔符以至会影响 shell 解释程序的时间格式请用双引号括起来。

不过,根据时间来管理以前的版本,似乎比较麻烦而且容易搞混淆。更好的方法是在项目开发每到一个阶段就打一个标签或建一个分支,这样以后就可以根据这个标签提取以前的代码了。至于怎么打标签,这个最好由 CVS 管理员来做,这里就不介绍怎么打标签了,感兴趣的可以参考另一份文档《 CVS 管理》。

例如,项目发布了 release 1.0 和 release 2.0 ,在这两次发布的时候,我们都分别打了标签project_name_release_1_0 、 project_name_release_2_0 ,这样,提取 1.0 和 2.0 版本的时候就可以这样做:

       cvsco –r project_name_release_1_0 project_name

       cvsco –r project_name_release_2_0 project_name

5)        修改一个文件的步骤

我们在修改一个文件并提交的时候,即不希望覆盖别人的改动,也不希望自己的改动被别人覆盖掉。在提交改动的时候,稍不注意就容易出错,这种错误一般不容易察觉,为以后的项目发展埋下隐患。

前面我们讲到过,在不同版本之间进行合并的时候,容易出现冲突,即使不出现冲突,合并的结果也不一定是你想要的。所以我们强烈建议在最新的版本上修改然后再提交。

首先,在你改动之前确保你的文件是最新的:

                     cvsstatus filename

              如果不是最新的,使用命令:

                     cvsupdate filename

              更新文件到最新版本。然后修改文件准备提交。在提交之前还得先运行命令

                     cvsstatus filename

以确保在你改动期间别人没有改动该文件并提交到库里。如果版本还是最新的,那再运行下列命令提交即可:

                     cvsupdate filename

                     cvsci –m “reason for modification” filename

如果在你改动期间,别人已经改动并提交了该文件,那得把你的文件备份,然后把最新的版本提取出来,再把你的该动加进去,然后提交。

总之,在每次提交之前,都要使用命令 cvs status 查询一下状态,切记!

6.     附录

1)        bash

刚刚建立帐号时, home 目录下可能还没有环境的配置文件,如果想用 bash ,则要在自己的 home 目录下建立两个文件: .bash_profile 和 .bashrc

以帐号 dyn 为例,在 /home/dyn 目录下建立文件 .bash_profile 和 .bashrc ,文件的内容如下:

.bash_profile:

       #.bash_profile

# Get thealiases and functions

if [ -f~/.bashrc ]; then

        .~/.bashrc

fi

# Userspecific environment and startup programs

PATH=$PATH:$HOME/bin

exportPATH

unsetUSERNAME

              .bashrc:

                     #.bashrc

# Userspecific aliases and functions

# Sourceglobal definitions

if [ -f/etc/bashrc ]; then

                      ./etc/bashrc

fi

CVSROOT=:pserver:dyn@192.168.0.148:/home/casic/cvsroot;export CVSROOT

2)        csh

刚刚建立帐号时, home 目录下可能还没有环境的配置文件,如果想用 csh ,则要在自己的 home 目录下建立一个文件: .cshrc

以帐号 ynding 为例,在 /home/ynding 目录下建立文件 .cshrc ,文件的内容如下:

              .chsrc:

                     #!/usr/bin/csh

###setpath###

setpath=(  . /

                                 /usr/bin/

                                 /usr/local/arm/2.95.3/bin/

                                  /usr/local/arm-elf/bin/

                                 /usr/local/bin/

                                 /usr/bin/

                                 /bin/

                                 /usr/sbin/

                                 /usr/local/sbin/

                                 /usr/X11R6/bin/

                                 /usr/X11R6/LessTif/Motif1.2/bin/

                             )

###ENVIRONMENTALSETTING

setenvCVSROOT /home/casic/cvsroot

###END

umask 027


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值