CVS使用详解.docx
《CVS使用详解.docx》由会员分享,可在线阅读,更多相关《CVS使用详解.docx(96页珍藏版)》请在冰豆网上搜索。
CVS使用详解
CVS使用详解
一、CVS简介
CVS是ConcurrentVersionsSystem的简称。
它是促进了OpenSource成功发展。
CVS解决多人合作开发时程式版本控管的问题.
二、术语中英对照
专案:
project
档案库:
repository
汇入专案:
import
发行版本:
version
正式版:
release
修改版次:
revision
版次编号:
revisionNumber
工作版本:
workingrevision
库存版本:
repositoryrevision
存入:
commit(ci/com)(我们常称此一动作为checkin)
取出:
checkout(co/get)
更新:
update(up/upd)
在库状态:
status(st/stat)
差异:
diff(di/dif)
新增:
add(ad/new)
移除:
remove(re/delete)
记录:
log(lo/log)
标记:
tag(ta/freeze)
最新版:
Up-to-date
已修改:
LocallyModified
需更新:
NeedsPatch
需合并:
NeedsMerge
三、关於CVS的版本编号
CVS的版次编号(revisionnumber)只做为CVS内部控管之用,和将来发行的软体版本(version)无关。
也就是说:
若某一支程式在CVS中版次编号为1.5,而发行的软体版本"您把它称为"SFS3.0版,那麽,这个1.5内部版次和3.0软体版本,是完全风马牛不相关的!
CVS的版次成长的过程如下:
第一次将专案汇入CVSServer时,所有档案的版次编号皆为1.1.1.1。
若修改存入档案库之後,版次编号就由1.2起跳,尔後每存入一次,版次编号就增加1。
您可以放心尽情地修改,不同的程式档之间的版次编号不必一致,也就是说:
一个专案中,A这支程式到了1.83版,B这支程式只到了1.3版,并不会影响将来发行软体的版本,我们可以利用标记(tag)等方式,来达到进一步控管的功能。
四、CVS的操作方式
cvs的操作方式,通常是:
cvs+动作命令+档案名称
常见的动作命令有:
loign、logout、commit、checkout、update、status、diff、log、add、remove等等,大部份的动作命令有简写,如commit可简写为ci,checkout可简写为co,update简写为up,status简写为st....,其它简写,可以执行cvs--help-synonyms查知。
除了动作命令之外,还有一些动作选项,比如cvsdiff-cinde.php这个-c即为diff的动作选项,它可显示出工作版本和库存版本差异之处的原始码对照。
这些选项,您可用mancvs查知
若不指定档案名称亦可,cvs会针对目前工作目录下,所有档案及子目录,统统视为作用对象。
如比:
更新工作版本时,cvsupdate不加档名,则cvs会将您目前工作目录下所有的档案及子目录皆予以更新。
若执行cvsupdateindex.php,则只有index.php这个档案会被更新。
五.CVS的使用流程
CVS使用Client/Server架构,Server端会开启2401这个服务通道,client端您可以选用cvs程式、支援CVS的编辑器(如emacs)、或CVS的操作环境(如Windows平台的wincvs/KDE平台的Cervisia)。
参与合作开发的伙伴,每一位都会由CVSServer档案库中,下载取出一份专案,这份专案储存在该员的硬盘中,我们称之为工作版本。
CVS使用的方式,便是:
每位成员编辑自己的那一份工作版本,再将修改结果上传存入CVSServer档案库中,而这个过程,由CVS系统来帮忙记录及控管。
登入(login),只需做一次。
需要密码认证,除非是允许匿名登入,否则都要输入CVSServer管理者配给您的密码。
取出(checkout)整份专案(类似档案下载)。
此时,您的硬盘中会有一份专案的原始码目录,我们称之为工作目录。
依您的程式意图,修改某一支程式。
查询程式的在库状态(status)。
(3、4这二个动作可互调或合并操作)
视在库状态,比对二者的差异(diff),调整修改的程式(是否和他人修改的部份发生冲突,若无冲突,那就十分单纯,可在修改完之後,直接存入(commit/ci)档案库(repository)中)
若有冲突,在maillinglist中,和他人讨论,取得协调。
将修改好的档案commit存入CVS档案柜(俗称checkin,类似档案上传),请务必在程式码注解中,详述您的意图。
透过maillinglist说明您的想法,和大家讨论。
每经过一段时日,应查询在库状态,并更新您的工作目录(update)。
六.使用CVS的准备动作
使用CVS前,应先设妥CVSROOT环境变数,请在~/.bash_profile(个人适用)或/etc/profile(全体适用)中加入以下设定:
exportCVSROOT=:
pserver:
ols3@xxx.xxx.edu.tw:
/home/export
注:
pserver:
ols3@xxx.xxx.edu.tw:
/home/export
只是一个例子,其中的帐号/主机/CVS目录,请勿直接套用。
实际设定值,请询问您的CVS管理员。
上述设定,在重新开机登入主机之後,即可生效。
若不想重新登入主机,可执行source~/.bash_profile,然後echo$CVSROOT看看,显示的变数内容是否正确?
若不设CVSROOT环境变数,将来所有cvs动作命令,都必须在命令列中直接指定,如下所示:
cvs-d":
pserver:
ols3@xxx.xxx.edu.tw:
/home/export"login
cvs-d":
pserver:
ols3@xxx.xxx.edu.tw:
/home/export"checkoutsfs2
若您已设妥CVSROOT,不代表您只能使用一台CVSServer而已,若有其它CVSServer,您可以在命令列中以-d直接指定。
七.登入CVS
#cvslogin
或
cvs-d":
pserver:
ols3@xxx.xxx.edu.tw:
/home/export"login
它会问你密码,正确回答密码之後,不会显示任何讯息。
cvs会将认证资讯,储存在~/.cvspass中,尔後,您就不必再做登入的动作了。
(除非您删除了.cvspass)
如下所示:
$cvslogin
Logginginto:
pserver:
ols3@xxx.xxx.edu.tw:
2401/home/export
CVSpassword:
登出则为:
cvslogout
它会将~/.cvspass清空,档案大小变成0,如下所示:
-rw-------1ols3ols3010月2121:
05/home/ols3/.cvspass
若已登出,则下次使用cvs各项命令动作之前,需再做登入的动作一次。
八.取出整份专案
请先切换到您喜爱的工作目录中,比如:
cd~/tmp
使用法:
cvscheckoutsfs2
或
cvscosfs2
它会在~/tmp目录下,产生sfs2目录,该目录中的内容全数由CVSServer中下载。
往後您就以在~/tmp/sfs2中,来编辑修改sfs2专案的各个程式档了。
您取出的专案版本,我们就称之为工作版本,存放在CVSServer中的称为库存版本;下载的sfs2这个目录,则称为工作目录。
如下所示:
$cvscosfs2
....以上省略....
Usfs2/upgrade/1.gif
Usfs2/upgrade/footer.php
Usfs2/upgrade/header.php
Usfs2/upgrade/sfs2.sql
Usfs2/upgrade/update_function.php
Usfs2/upgrade/upgrade1.1-2.0.php
Usfs2/upgrade/ustep0.php
Usfs2/upgrade/ustep1.php
Usfs2/upgrade/ustep2.php
Usfs2/upgrade/ustep3.php
Usfs2/upgrade/ustep4.php
九.查询状态
使用法:
cvsstatus档案名称
或
cvsst档案名称
或
cvsst
若不加档案名称,则会显示所有档案的状态。
例:
$cvsstindex.php
===================================================================
File:
index.phpStatus:
Up-to-date
Workingrevision:
1.1.1.1
Repositoryrevision:
1.1.1.1/home/export/sfs2/index.php,v
StickyTag:
(none)
StickyDate:
(none)
StickyOptions:
(none)
表示index.php目前最新版是1.1版(以1.1.1.1代表)
请注意上面右上角的讯息Status,常见的讯息有:
Up-to-date:
最新版
LocallyModified:
已修改
NeedsPatch:
需更新
NeedsMerge:
需合并
十.修改程式、存入档案库
使用法:
cvscommit档案名称
或
cvsci档案名称
或
cvscom档案名称
或
cvsco
若不加档案名称,则目前目录下所有档案及子目录全部存入。
例:
index.php程式码内容原为:
php
session_start();
/*取得学务系统设定档*/
include"include/config.php";
//--程式档头
head("首页","",1);
//列出模组
print_module
(1);
foot();
?
>
在第2列新增一列注解#启动session
变成:
php
#启动session
session_start();
/*取得学务系统设定档*/
include"include/config.php";
//--程式档头
head("首页","",1);
//列出模组
print_module
(1);
foot();
?
>
先查一下它的状态:
$cvsstindex.php
===================================================================
File:
index.phpStatus:
LocallyModified
Workingrevision:
1.1.1.1
Repositoryrevision:
1.1.1.1/home/export/sfs2/index.php,v
StickyTag:
(none)
StickyDate:
(none)
StickyOptions:
(none)
由右上角这句Status:
LocallyModified,表示cvs已把档案库中的index.php和~/tmp/sfs2/index.php这个同名的local档案做了比对,它发现有人已对local的index.php做了修改。
接着,将index.php存入CVS档案库中:
cvsci-m"增加一列注解"index.php
ci是存入之意,-m後面接续本次存入的记录讯息,主要目的,是用来让自己及合作伙伴,将来能对这次的修改动作有迹可循。
若您没有加-m"记录讯息"也无妨,cvs会主动叫出vi,要求您必须输入记录讯息,如以下操作画面:
增加一列注解
CVS:
----------------------------------------------------------------------
CVS:
EnterLog.Linesbeginningwith`CVS:
'areremovedautomatically
CVS:
CVS:
Committingin.
CVS:
CVS:
ModifiedFiles:
CVS:
index.php
CVS:
----------------------------------------------------------------------
按wq存档离开,出现以下画面:
$cvsciindex.php
Checkinginindex.php;
/home/export/sfs2/index.php,v<--index.php
newrevision:
1.2;previousrevision:
1.1
done
由上述讯息可知:
index.php已成功存入档案库,目前修改版次为1.2。
用cvsstindex.php再查查看index.php状态:
===================================================================
File:
index.phpStatus:
Up-to-date
Workingrevision:
1.2
Repositoryrevision:
1.2/home/export/sfs2/index.php,v
StickyTag:
(none)
StickyDate:
(none)
StickyOptions:
(none)
由右上角Status:
Up-to-date这个讯息可知:
index.php存入成功,和目前工作目录下的工作版本一致,已是最新的版本了。
--------------------------------------------------------------------------------
十一.更新工作版本
经过一段期日,或许别人已修改了某些程式码存入档案库中,此时应该用update指令,更新一下目前的工作版本。
使用法:
cvsupdate档案名称
或
cvsup档案名称
或
cvsup
若要连档案库中新增的目录也下载,要加上-d选项。
cvsup-d
若不加档案名称,则会更新所有的档案及子目录内容。
例:
$cvsupdate
显示画面如下:
cvsserver:
Updating.
Uindex.php
cvsserver:
Updatingadmin
cvsserver:
Updatingadmin/board_man
...以下省略....
或
$cvsupindex.php
Uindex.php
上述出现Uindex.php,表示local工作版本index.php已经更新,和库存版本一致。
若您在更新之前,已修改了index.php,会出现以下情况:
$cvsup
cvsserver:
Updating.
Mindex.php
cvsserver:
Updatingadmin
cvsserver:
Updatingadmin/board_man
...以下省略....
Mindex.php表示local版本已被修改,update命令不会予以覆盖更新,您可以查询一下状态:
$cvsstindex.php
===================================================================
File:
index.phpStatus:
LocallyModified
Workingrevision:
1.7
Repositoryrevision:
1.7/home/export/sfs2/index.php,v
StickyTag:
(none)
StickyDate:
(none)
StickyOptions:
(none)
由Status:
LocallyModified可知您已修改了local工作版本,和库存版本并不一致。
有时我们需要看看二者有何差异。
详情请见下一节内容。
十二.比对版本差异
当发现工作版本和库存版本不一致时,需要比对了解差异之处。
使用法:
cvsdiff档案名称
或
cvsdif档案名称
或
cvsdiff
以上将简单列出,比对的差异列数及内容
====================================
cvsdiff-c档案名称
或
cvsdif-c档案名称
或
cvsdiff-c
以上命令将完整显示差异之原始码对照
====================================
diff也可以指定要和那一个修改版次做比对:
如:
cvsdiff-r1.5-cindex.php
即表示要拿index.php的工作版本和库存版本1.5比较差异。
若不加档案名称,则会比对所有的档案及子目录内容。
例:
$cvsdiff
显示画面如下:
cvsserver:
Diffing.
Index:
index.php
===================================================================
RCSfile:
/home/export/sfs2/index.php,v
retrievingrevision1.7
diff-r1.7index.php
15d14
<#3333333333333333
cvsserver:
Diffingadir
cvsserver:
Diffingadmin
cvsserver:
Diffingadmin/board_man
cvsserver:
Diffingadmin/board_man/images
cvsserver:
Diffingadmin/create_data
cvsserver:
Diffingadmin/create_data/images
cvsserver:
Diffingadmin/fixed_man
cvsserver:
Diffingadmin/fixed_man/images
...以下省略...
注意!
若不想显示一些不相干的Diffing讯息,
可多加一个-Q(最安静)或-q(安静)的选项:
cvs-Qdiff
cvs-qdiff
或直接加入档名
cvsdiffindex.php
上面讯息中,有几个地方解释於下:
RCSfile:
/home/export/sfs2/index.php,v
这一列是说:
CVS使用RCS这个版本控制系统的档案格式
retrievingrevision1.7
这一列是说:
正在取出的库存版本的修改版次是1.7
diff-r1.7index.php
这一列是说:
工作版本index.php和库存版本1.7做比对
15d14
<#3333333333333333
这二列是说:
比对结果发现,工作版本把库存版本的第15列被删除(d),
被删的那一列内容为#3333333333333333
注意:
d代表删除
a代表新增
<这个符号代表库存版本中的某些列
>这个符号则代表工作版本中的某些列
再举一个例子:
$cvsdiffindex2.php
Index:
index2.php
===================================================================
RCSfile:
/home/export/sfs2/index2.php,v
retrievingrevision1.2
diff-r1.2index2.php
2a3
>#session的意义您了解吗?
解释如下:
RCSfile:
/home/export/sfs2/index2.php,v
CVS中的RCS档是index.php,v(CVS其实是借用RCS版本控制的格式)
retrievingrevision1.2
目前取出的修改版次是1.2
diff-r1.2index2.php
比对1.2和工作版本index2.php的差异
2a3
在第2列之後,工作版本新增(add,以a简写)了第3列,
第3列的内容为
#session的意义您了解吗?
>代表工作版本中的某些列
不过,上述比对差异太过简单,有时不容易看出端倪,因此,最好能将二者的差异之处,以原始码对照的方式列出来,将会比较清楚。
此时,要加一个-c的动作选项,如以下例子:
$cvsdiff-cindex.php
有以下结果:
Index:
index.php
===================================================================
RCSfile:
/home/export/sfs2/index.php,v
retrievingrevision1.7
diff-c-r1.7index.php
***index.php19Oct200214:
58:
16-00001.7
---index.php20Oct200207:
42:
11-0000
***************
***12,18****
#22222222222222
#echotest
//列出模组
-#3333333333333333
print_module
(1);
f