版本控制工具SVN和CVS

wzNewFace00 2010-06-11

CVS相信大家都听说过,不过这个广为使用的版本控制工具还有不少问题,包括中文支持和二进制文件的处理都有或多或少的问题。

现在好了,CVS的作者又为我们开发了SVN。Gnome和KDE的开发团队都已经换用SVN了,您为什么不试一下呢?

最基本的用法

建立代码库svnadmincreate/path/to/repos导入数据svnimport/path/to/projectfile::///path/to/repos-m"initialimport"导出数据svncheckoutfile::///path/to/repos提交更新svncommitfilename添加文件svnadd删除文件svndelele复制文件svncopy移动文件svnmove查询状态svnstatus检查不同svndiff同步工作目录svnupdate合并代码svnmerge;svnresolveSVN的相关资源

这里是SVN的项目网站。

<<VersionControlwithSubversion>>的电子书。

这里是繁体中文的SVN文档(只有部分被翻译过来了)。

不能不提的CVS

虽然我已经转入了SVN的阵营,但是CVS仍然是应用最为广泛的版本控制软件之一。这里收集了一些关于CVS的资源。

CVSD的安装与配置

CVS使用简介

(注:这是oscargreat整理的资料,我拿来用相信他不会介意:)

什么是CVS

CVS(CocurrentVersionSystems,并发版本系统)是一个C/S模式的版本控制系统,用于在软件开发过程中记录文件版本,协调开发人员保证文件同步,从而保证项目正确的进行并行开发,并支持版本回滚、bug跟踪和补丁生成。使用CVS可以有效地对软件开发的源代码和开发文档进行统一的管理和组织。

CVS的工作模式:

CVS的基本工作模式如下:

CVS服务器(代码文档库)/|\(版本同步)/|\开发者1开发者2开发者3CVS在服务器端维护代码文档库,不同的开发者在本地机器上建立对应代码树,并利用CVS保持本地代码文档同代码文档库的一致。当由于多个开发者对文件的同时修改造成本地与库中的代码文件冲突时,CVS报告并协助解决冲突代码的合并问题。普通开发者(非管理员)对CVS的使用流程如下所示:

Checkout(获取)--------------------Merge(合并)||^vvConflict(冲突)|Modify(修改)->Update(更新)----------------^|||NoConflict(无冲突)|vUpdate(更新)<-Commit(提交)|vExport(导出)checkout命令只需在开始建立本地代码树时使用一次,其后更新本地代码则使用update命令。update命令比较服务器和本地代码库的区别,并把本地代码树中过时的文件自动更新。当完成对代码的修改之后,在提交代码之前同样需要使用update命令,以获取他人并行修改的的代码。如果出现冲突(即对同一文件同时进行了修改),CVS将在本地代码中把两者都保留并标记出来,要求开发者处理冲突。在冲突不存在或已解决的情况下,使用commit命令将服务器代码更新为本地代码。CVS要求为更改提供注释,并自动为更新的文件处理版本编号。当软件需要正式发布时,使用export命令导出不包含CVS设置信息的源代码树。

CVS的管理员还使用包括init,import,admin等命令对服务器和代码库进行配置和设置。

CVS在Linux下客户端的使用

Linux下的多种IDE/Editor,如Emacs,Eclipse等都对CVS提供了支持,但基于命令行的cvs操作是最为基本和灵活的。以下介绍CVS命令行的使用。

环境变量

CVSROOT指定代码库的位置如果CVS代码库在本地机器上,可直接指定代码库的路径,如:exportCVSROOT=/path/to/cvsroot如果CVS代码库在服务器上,则还需指定服务器位置,通信方式及用户等信息,格式为:CVSROOT=:method:username@cvs.server.address#port:/path/to/cvsroot例如:exportCVSROOT=:ext:horn@166.111.55.119:/cvs/horn其中ext指定使用SSH协议,horn是有权访问服务器相应目录的用户。CVSROOT的值可以在命令行上用-d选项重新指定,如:cvs-d/cvs/hornupdateCVS_RSH指定客户端访问服务器的协议使用SSH协议时,可如下设置:exportCVS_RSH=ssh基本命令

cvs的命令行格式为:

cvs[options]command[options]filename具体参数可参考infocvs

cvs的命令如果不带参数,则总是以当前所在目录作为操作对象。

以下介绍基本命令:

initCVS代码库的初始化,管理员使用。cvs-d/cvs/horninit将/cvs/horn初始化为一个代码库import导入一个项目/模块,管理员使用。cvsimport-m"comments"project_namevendor_tagrelease_tag执行后,会将当前目录下所有文件及目录导入到/path/to/cvsroot/project_name目录下。vender_tag:开发商标记release_tag:初始版本标记-m参数如果不加,则cvs会自动启动vi,要求输入注释。如:cd/home/horn/blob-2.05/cvsimportblobHornworksInitVersioncheckout/co从服务器获取代码,在本地建立代码树cvscheckoutproject_nameupdate/up将本地文件同步到最新的版本cvsupdatefilename不指定文件名,cvs将当前目录下所有子目录下的文件。如前所述,在每天工作前和工作之后commit之前都应当update,以保证本地代码总是最新的,且和服务器的代码无冲突。commit/ci将修改同步到CVS库里cvscommit-m"writesomecommentshere"file_nameCVS的很多动作都是通过cvscommit进行最后确认并修改的。在确认的前,还需要用户填写修改注释,以帮助其他开发人员了解修改的原因。add向项目中添加文件/目录cvsaddnew_file添加文件之前应当首先创建文件,之后使用cvsadd添加。添加文件的操作只有经过cvscommit之后才真正被添加到代码库中。对于图片,Word文档等非纯文本的项目,需要使用cvsadd-kb选项按二进制文件方式导入(k表示扩展选项,b表示binary),否则有可能出现文件被破坏的情况。remove/rm从项目中删除文件cvsremovefile_name删除时,应当先将某个源文件物理删除后,再使用remove命令。比如:rmfile_namecvsremovefile_name然后commit确认删除。也可以加上-f参数将两步合一:cvsremmove-ffile_namecvscommit-m"whydeletefile"cvs不允许删除目录,空目录在update时会依选项自动忽略。log/history查看修改历史cvslogfile_namediff查看文件不同版本的区别cvsdiff-r1.3-r1.5file_name查看1.3版本何1.5版本的区别cvsdifffile_name查看本地和库中文件的区别tag标记版本号cvstagrelease_versionCVS自动维护每个文件的版本号,文件每修改一次,则其版本号自动增加。此版本号不能用作阶段性发布使用。tag命令为当前目录下所有文件标记一个统一的发行版本号。如:cdblob/cvstag2.1.0-Hornworkstag命令应当由项目负责人统一指定和使用。export项目发布,导出不带CVS目录的源文件本地代码树的每个目录下,CVS都创建了一个CVS/目录用于记录当前目录和CVS库之间的对应信息。export可以导出不包含CVS目录的代码树。cvsexport-rreleaseproject_name导出版本号标记为release的代码cvsexport-D20021023project_name导出截至2002.10.23时最新的文件

相关推荐