CVS入门作者:卧龙小叁ols3@台南县教育网路中心(注:这篇讲义仍在撰写中,内容会陆续补上来)Copyright©2002byOLS3v1.0.010/20/2002v1.0.110/26/2002TableofContents1.前言2.术语中英对照3.关於CVS的版本编号4.操作方式5.使用流程6.使用CVS的准备动作7.登入CVS8.取出整份专案9.查询状态10.修改程式、存入档案库11.更新工作版本12.比对版本差异13.查询记录14.新增档案15.新增目录16.删除档案17.删除目录18.更改档名19.更改目录名20.解决程式码冲突21.取出过去的专案版本22.依时间点取出过去的专案23.依标记取出过去的专案24.分支(branch)25.合并分支及主干26.取出专案,推出(release)软体版本27.关键字展开28.二进位档的处理29.CVSmanpage30.CVS速查31.架设CVSServer参考资源1.前言CVS是ConcurrentVersionsSystem的简称。它是现今OpenSource成功发展的幕後功臣之一。CVS解决多人合作开发时程式版本控管的问题,通常会再搭配邮件列表(MailingList)做为开发团队沟通的管道。这种组合,使开发团队不受时间地域限制,合作伙伴分散全世界,且团队大小没有上限,因此OpenSource才能集合世界各地高手,不断地薪火相传、不断地推出高品质的自由软体。不过,CVS初期上手不易,但若能以功能需求导向(我想要做这个,如何办到呢?)的方式来学习,可能也不是那麽困难。本讲义,全部在textconsole模式下操作,但不代表您也必须用这种模式,您可以选用您喜爱的任何一种有支援CVS的编辑器或CVS操作环境(比如WinCVS)。不过,您必须先了解CVS各种操作的涵意,这样观念才会清楚,才能确切掌握CVS,和大家共同开发时,才能顺利愉快增进效率。一但您熟悉console模式之後,欲转换到其它环境,皆能有清晰的观念基础。本文原为校园自由软体学务系统(sfs)合作开发伙伴而写的讲义,为免影响sfs3正式的系统(91/10开始),本文是以xxx.yyy.edu.tw中旧的sfs2专案为例子。往後您只要把出现sfs2的地方,改成sfs3或其它专案的名称,即可套用到其它专案。注:CVS不是CSV!!前者为版本控制系统,後者则是一种将每一列栏位用逗点分开的文件档案格式。2.术语中英对照我把讲义中会用到的术语,以中英对照的方式表列於此。这份对照只是CVS其中一小部份,往後会逐渐增加。您大致看一下即可,一开始不必强记。专案:project档案库:repository汇入专案:import发行版本:version(如SFS3.0版)正式版: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需合并:NeedsMerge3.关於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)等方式,来达到进一步控管的功能。4.操作方式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这个档案会被更新。5.使用流程CVS使用Client/Server架构,Server端会开启2401这个服务通道,client端您可以选用cvs程式、支援CVS的编辑器(如emacs)、或CVS的操作环境(如Windows平台的wincvs/KDE平台的Cervisia)。参与合作开发的伙伴,每一位都会由CVSServer档案库中,下载取出一份专案,这份专案储存在该员的硬碟中,我们称之为工作版本。CVS使用的方式,便是:每位成员编辑自己的那一份工作版本,再将修改结果上传存入CVSServer档案库中,而这个过程,由CVS系统来帮忙记录及控管。一般而言,CVS的使用流程,大致如下:1.登入(login),只需做一次。需要密码认证,除非是允许匿名登入,否则都要输入CVSServer管理者配给您的密码。2.取出(checkout)整份专案(类似档案下载)。此时,您的硬碟中会有一份专案的原始码目录,我们称之为工作目录。3.依您的程式意图,修改某一支程式。4.查询程式的在库状态(status)。(3、4这二个动作可互调或合并操作)5.视在库状态,比对二者的差异(diff),调整修改的程式(是否和他人修改的部份发生冲突,若无冲突,那就十分单纯,可在修改完之後,直接存入(commit/ci)档案库(repository)中)6.若有冲突,在maillinglist中,和他人讨论,取得协调。7.将修改好的档案commit存入CVS档案柜(俗称checkin,类似档案上传),请务必在程式码注解中,详述您的意图。8.透过maillinglist说明您的想法,和大家讨论。9.每经过一段时日,应查询在库状态,并更新您的工作目录(update)。6.使用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/exportlogincvs-d:pserver:ols3@xxx.xxx.edu.tw:/home/exportcheckoutsfs2若您已设妥CVSROOT,不代表您只能使用一台CVSServer而已,若有其它CVSServer,您可以在命令列中以-d直接指定。7.登入CVS使用法:cvslogin或cvs-d:pserver:ols3@xxx.xxx.edu.tw:/home/exportlogin它会问你密码,正确回答密码之後,不会显示任何讯息。cvs会将认证资讯,储存在~/.cvspass中,尔後,您就不必再做登入的动作了。(除非您删除了.cvspass)如下所示:$cvsloginLogginginto:pserver:ols3@xxx.xxx.edu.tw:2401/home/exportCVSpassword:登出则为:cvslogout它会将~/.cvspass清空,档案大小变成0,如下所示:-rw-------1ols3ols3010月2121:05/home/ols3/.cvspass若已登出,则下次使用cvs各项命令动作之前,需再做登入的动作一次。8.取出整份专案请先切换到您喜爱的工作目录中,比如:cd~/tmp使用法:cvscheckoutsfs2或cvscosfs2它会在~/tmp目录下,产生sfs2目录,该目录中的内容全数由CVSServer中下载。往後您就以在~/tmp/sfs2中,来编辑修改sfs2专案的各个程式档了。您取出的专案版本,我们就称之为工作版本,存放在CVSServer中的称为库存版本;下载的sfs2这个目录,则称为工作目录。如下所示:$cvscosfs2....以上省略....Usfs2/upgrade/1.gifUsfs2/upgrade/footer.phpUsfs2/upgrade/header.phpUsfs2/upgrade/sfs2.sqlUsfs2/upgrade/update_function.phpUsfs2/upgrade/upgrade1.1-2.0.phpUsfs2/upgrade/ustep0.phpUsfs2/upgrade/ustep1.phpUsfs2/upgrade/ustep2.phpUsfs2/upgrade/ustep3.phpUsfs2/upgrade/ustep4.php9.查询状态使用法:cvsstatus档案名称或cvsst档案名称或cvsst若不加档案名称,则会显示所有档案的状态。例:$cvsstindex.php===================================================================File:index.phpStatus:Up-to-dateWorkingrevision:1.1.1.1Repositoryrevision:1.1.1.1/home/export/sfs2/index.php,vStickyTag:(none)StickyDate:(none)StickyOptions:(none)表示index.php目前最新版是1.1版(以1.1.1.1代表)请注意上面右上角的讯息Status,常见的讯息有:Up-to-date:最新版LocallyModified:已修改NeedsPatch:需更新NeedsMerge:需合并10.修改程式、存入档案库使用法:cvscommit档案名称或cvsci档案名称或cvscom档案名称或cvsco若不加档案名称,则目前目录下所有档案及子目录全部存入。例:index.php程式码内容原为:?phpsession_start();/*取得学务系统设定档*/includeinclude/config.php;//--程式档头hea