- 浏览: 537936 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
landerson:
明显就有要求的嘛
ANDROID轻量级JSON序列化和反序列化[转] -
jimode2013:
很不错,就是需要这个方法
多个UIViewController使用addSubView,第二个 UIViewController 不响应旋转[转] -
w11h22j33:
...
[转]NSMutableArray中的自动释放对象让我郁闷了一整天 -
w11h22j33:
UILabel* label = [[UILabel a ...
Iphone开发 -
w11h22j33:
http://mobile.51cto.com/iphone- ...
获得通讯录中联系人的所有属性[转]
每个编写程序的人也许都有过这样的体验:对编写的程序作了一些修改,几天以后,我们可能发现上次的修改导致了其它的矛盾,甚至编译不能通过,但这时我们却很难找到自己刚在哪里作了改动。一般说来,我们总是希望自己完整的记录下一个程序开发的过程,记录下这个程序的每一点改进和调整。或许我们可以用备份的方法来解决这个问题,于是我们建立一个backup的目录,定期或不定期的将自己的源程序打包放进去,直到某一天整个硬盘都被这些文件撑满。这当然有些夸张,但这种机制带给我们的不方便是显而易见的。更进一步,现在一个软件产品的开发,一个人单枪匹马很难完成。可能是包含几个、几十个乃至上百个程序员协作开发,这时的源代码又该如何管理?解决问题的方法就是使用CVS。
CVS - Concurrent Versions System(并发版本管理系统)是一个版本控制管理系统,它是目前最为广泛使用的一个系统。从gftp到gtk到KDE,你几乎可以在每一个你熟悉的自由软件的源码里看到它的踪迹(下面我们会知道,它的踪迹指一个称为cvs的子目录)。同样,你也可以在几乎每一个Linux的发行版本里看到CVS系统。可以说,如果失去了CVS,现有的许多多人协作、自由开发的软件都会在一定程度上放慢自己发展的步伐。
CVS到底有哪些功能,使得它有如此强大的魅力呢?
1.CVS能做什么?
如上所说,CVS首先是一个版本管理系统,它可以保留软件开发过程中的每一个版本的信息,包括谁、在何时、作了什么样的修改以及为什么作这样的修改等。这个功能和以前流行于Linux和Unix的版本管理系统RCS(Revision Control System)和SCCS(Source Code Control System)很象。但CVS的功能远非仅此。它的最大的特点是它的并发性,即它支持分布式项目的开发。在互联网席卷一切的今天,这个功能太为重要了。小到一个办公室内部开发一个OA系统,大到KDE小组利用互联网开发新版本的KDE,CVS都可以一展身手。一个程序员开发出了自己负责模块的新版本后,迅速的通过CVS让开发组的每一个成员都分享自己的最新成果。甚至,CVS通过特定的机制允许多个程序员同时修改同一个源程序文件。
另外CVS增强的目录结构以及对二进制文件良好的处理,都使得它远远优于其它的版本管理系统。最后,必须一提的是CVS是基于RCS开发而成的。
2.如何得到CVS?
1.CVS能做什么?
如上所说,CVS首先是一个版本管理系统,它可以保留软件开发过程中的每一个版本的信息,包括谁、在何时、作了什么样的修改以及为什么作这样的修改等。这个功能和以前流行于Linux和Unix的版本管理系统RCS(Revision Control System)和SCCS(Source Code Control System)很象。但CVS的功能远非仅此。它的最大的特点是它的并发性,即它支持分布式项目的开发。在互联网席卷一切的今天,这个功能太为重要了。小到一个办公室内部开发一个OA系统,大到KDE小组利用互联网开发新版本的KDE,CVS都可以一展身手。一个程序员开发出了自己负责模块的新版本后,迅速的通过CVS让开发组的每一个成员都分享自己的最新成果。甚至,CVS通过特定的机制允许多个程序员同时修改同一个源程序文件。
另外CVS增强的目录结构以及对二进制文件良好的处理,都使得它远远优于其它的版本管理系统。最后,必须一提的是CVS是基于RCS开发而成的。
2.如何得到CVS?
CVS在几乎包含在所有的Linux发布版本中,如RedHat、Turbo Linux、Slackware以及国产的红旗、Xteam Linux等。你可以试着敲一下cvs命令,大多数情况下都会出现以Usage: cvs开头的一堆信息,提示你如何使用cvs,这意味着在你的机器上早已有了CVS,只是遗憾的是它一直未被你发现和利用。运气不好的话,你会看到形如cvs: Command not found.的提示,这意味着你的机器没有安装CVS。这时你有两种选择。一是找到你的Linux安装盘,从那里安装CVS。例如在使用RPM方式安装的Linux(上面介绍的几个发布版本中似乎除了Slackware,其他都是)发布版本中,找到cvs***.rpm,用rpm命令进行安装。第二种方式是到一些站点cvs的源代码,然后遵循里面附带的指导进行安装。
3.CVS的基本使用方法
在这一节里,我们来学习掌握CVS的一些基本使用方法。现在我们假定已经安装好了CVS,并且我们打算用它来管理自己正在开发的一个软件,软件名叫netants,它存放在硬盘上一个叫做netants的目录里,目前里面有了文件netants.c、netants.h、http.c、http.h和Makefile。我们并没有和它人协作开发这个软件,也没有利用Internet或者Intranet来开发这个软件。或许,它只是自己的一个业余作品,试图写出一个比Windows下的网络蚂蚁更好的下载工具出来。
3.1初始化CVS
我们首先要使用的命令是cvs init,这个命令用来初始化CVS系统。正如我们所看到的,所有的CVS命令都以cvs开头,然后在后面紧跟命令、参数和一些选项。初始化CVS系统主要是为了创建一个为CVS所使用的源码储存库(repository)。创建的时候,需要指定在那个目录下创建这个源码储存库。有两种方法来指定目录。一是利用"-d "选项来指定,例如:-d /usr/local/cvsroot。另一种更方便的方法是在shell里设定一个名叫CVSROOT的环境变量。使用csh或者tcsh的用户可以使用命令setenv来设定,在文件.csh rc或者文件.tcshrc里添加入下的一行: setenv CVSROOT /usr/local/cvsroot 使用sh或者bash的用户需要在文件.profile或者文件.bashrc里添加如下两行: CVSROOT=/usr/local/cvsroot export CVSROOT 设置了环境变量CVSROOT后,我们运行命令cvs init,CVS将在指定的目录下面建立自己所需要的一些文件,以后我们使用CVS管理的任何项目,都会被CVS储存在这个目录之下。不过千万要注意的是:永远不要去试图修改这个目录下的文件。这个目录是由CVS自己进行管理的,轻率的改动可能会导致你丢失你部分或全部的交由CVS管理的源代码或其他资源。
3.2导入项目到CVS中去
初始化结束以后,我们就要真正开始利用CVS来管理自己的程序网络蚂蚁了。第一步,我们将这个项目交由CVS管理。使用如下的CVS的import命令,将源程序导入到CVS的源码储存库中去: cd netants cvs import -m "start my project: Netants" netants yoyo start 这个命令看起来有些复杂,需要解释一下。import是cvs的导入命令,默认状况下,它循环的将当前目录下的所有文件(包括子目录)导入到源码库(即CVSROOT指定的目录)里去。-m "start my project: Netants"告诉CVS你对这一步操作的说明。这是CVS强制要求的,如果你没有使用这种-m "字符串"的选项,CVS将会弹出一个文本编辑器(如果自己不特别指定的话,在Linux下一般是vi,而在Windows下则是Notepad),让你输入一些说明信息它才罢休。netants是这个项目被CVS存储时的路径名,即CVS将在创建一个$CVSROOT/netants的目录,并在此目录下存放此项目的文件,当然,它不是原封不动的存储,CVS会做一番处理。最后两个字符串设定了两个标记(tag),现在并没有什么用处,但它们同样是CVS指定必需的,所以我们添上这两个参数。执行此命令时,CVS自动将所有的文件版本设为1.1,这是它所认为的最低版本。以下为执行上述命令后的显示信息:N netants/netants.c N netants/http.c N netants/http.h N netants/netants.h N netants/Makefile No conflicts created by this import N表示New,CVS成功的加载了这些文件,并没有发现冲突。 上面的命令稍长了一些,而且显得有些繁琐,相信我,CVS不总是这样的,这点"繁琐"相对它给我们带来的便利是完全可以忽略不计的。
3.3从CVS中导出项目
好了,我们把自己的netants的项目交给了CVS去管理,现在,我们完全可以删除原有的存储我们代码的netants目录(当然,安全起见,你或许应该再做一次备份,并希望是最后一次)。我们要进行开发工作了,建一个目录,叫什么呢,就叫worktmp吧。我们进到此目录下,执行命令cvs checkout netants,我们将会看到如下的信息:cvs checkout: Updating netants U netants/Makefile U netants/http.c U netants/http.h U netants/netants.c U netants/netants.h CVS在当前目录下建立一个叫做netants的目录,我们原先的代码文件都在这个目录下出现了,而且还多了一个名为CVS的目录。目录CVS下面存放的是一些文本文件,记录了CVSROOT的位置、此项目对应源码库中那个目录等一些信息。
3.4保存修改到CVS中
现在,我们开始艰苦卓越的编程工作。经过数十分钟、数小时乃至数天的工作,我们对原有的代码做了较大的修改,现在要告一段落了。我们将修改的内容提交给CVS,于是,我们需要执行命令 cvs commit -m "Made some useful changes on some files" 这时,我们将会看到CVS给出一些提示信息,它扫描并比较此目录下的现有文件和它在源码库中保存的原有文件,做了修改的文件将被更新,并且有了新的版本号:1.2。-m参数如同前面所说,是为了不想它启动一个文本编辑器来让自己输入。如果我们仅是修改了其中一两个文件,我们可以在上面的命令的最后附上文件名,这样CVS只会比较、更新指定的文件。注意的是,和自己做备份不同,CVS只是保存了不同版本之间的差异,并没有完整的保存各个版本。现在,你是不是觉得CVS有点用处了。
3.5添加文件到项目中
有一天,我们开始考虑给我们的网络蚂蚁加上从ftp站点下载文件的功能,于是,我们需要在原有的项目里添加两个文件:ftp.c和ftp.h。首先,我们在工作目录下建立并编辑、修改、生成了这两个文件,然后我们使用命令add命令来添加。 cvs add ftp.c ftp.h 此时,文件并没有真正的被添加,只是相当于"注册"了一下,要使这个过程生效,我们仍然需要使用commit命令: cvs commit ftp.c ftp.h -m "Add two files: ftp.c and ftp.h" 此时,CVS将把这两个文件添加到项目中去,他们的版本均为初始的1.1。3.6从项目中删除文件 除了添加以外,我们有的时候可能需要删除某个文件,例如我们发现文件netants.h其实没有什么用。于是,我们执行下面几个命令来完成删除工作: rm netants.h cvs remove netants.h cvs commit netants.h -m "Delete a file." 要注意的是,CVS只是删除了当前版本的netants.h,它以前的版本依然存在,除非它恰好仅有1.1版本。
3.7设定特定版本号
经过一段时间的工作,程序已经初具规模,形成了较稳定的版本。这个时候,netants.c可能已经是5.4版本,而http.c可能是3.5版本,而我们希望将当前的代码作一个版本发布。此时,我们需要使用的是tag命令。这个命令赋予指定的一个或多个文件一个给定的文本形式的版本号。版本号必须以字母开始,可以包含数字、下划线和连接符号(-)。我们想给当前项目的所有文件赋予相同的版本号时,可以不指定文件或路径参数,CVS默认选择当前目录下所有在CVS中注册的文件(循环进子目录)。下面既是一个例子: 键入命令:cvs tag release0-1 提示信息: cvs tag: Tagging . T Makefile T ftp.c T ftp.h T http.c T http.h T netants.c 这样当前版本的所有文件都有了一个叫做release0-1的版本代号。当我们需要这个版本的时候,我们使用-r (版本代号)参数来得到指定的版本。例如命令: cvs checkout -r release0-1 netants 将在当前目录下建立netants目录,并导出所有版本代号为release0-1的文件。
3.8更新当前工作目录中的文件
这里使用的命令为update,它将比较指定的在CVS源码库中的文件和当前目录下的文件,如果CVS源码库中有更高版本的源文件,则更新当前目录下的文件。这个功能主要是多人协作开发项目时使用的,让你及时分享同伴的工作成果。但它另外一个重要的用途,同样适用于单人开发的项目。这个用途需要使用-j参数,我们看下面的例子: cvs update -j 1.5 -j 1.3 netants.c 这个命令的功能是,在当前目录的netants.c文件中,忽略从版本1.3到版本1.5所作的修改。毫无疑问,对程序员来说,这是一个非常重要的功能。因为在某个阶段我们对程序所作的修改在现在可能会被视为是无效乃至错误的,这个功能很好的解决了这个问题。在更新的过程中,CVS执行一个自动合并的过程。例如我们的工作目录中的netants.c文件版本是2.1,并且我们已经对此文件作了一番修改,而CVS源码库中的是版本2.2,此时我们执行update命令时,CVS并不是简单的将版本2.2覆盖版本2.1,而是试图将自版本2.1到版本2.2的修改添加到当前目录中的文件中去,如果它和我们刚刚所作的修改有冲突,则CVS会以字符串">>>>"表示由冲突发生,期待用户去修改。CVS拒绝接受包含有上述特定字符串的文件。下面即是一个冲突的例子:netants.c:版本号2.2,保存在CVS中……getPartFile( ); showFinished(); return(A); }……
netants:版本号2.1经过我们的修改……getPartFile( ); return(B); }……我们执行命令cvs update netants.c后,将会包含如下内容的新的netants.c:
……getPartFile( ); showFinished(); >>>>>> 2.2 }…… 除非我们做出修改并删去">>>>>>",否则在执行cvs commit的时候,netants.c将不会更新原有的2.2版本。
4.CVS的其他功能
CVS当然远不止上面所说的这些内容,这些仅是CVS的基本功能,CVS还有许多重要的功能,如上面所说的网络工作方式、支持二进制文件等。下面我们对这些功能作简单的说明。
4.1 CVS的网络工作方式
CVS的网络功能采用client-server结构,两地均需安装CVS。CVS采用rsh方式或者口令校验方式进行工作。对client端,同前面讲过的设置环境变量CVSROOT一样,用户需要设置新的环境变量CVS_SERVER,指明CVS在server上的路径,例如:/usr/local/cvsroot1。CVS的-d参数指定路径名,它后面可以用:(local或server或ext):来指明是在本地还是在异地服务器上,默认当然是在本地,正如我们在初始化CVS一节所使用的那样。下面的命令假定我们的CVS服务器为cvs.rdcps.ac.cn,用户名为crazyyao,CVS源码库在服务器的/usr/local/cvsroot1目录下,我们的工作项目还是netants,我们用rsh方式导出项目文件: cvs -d : server : crazyyao@cvs.rdcps.ac.cn :/usr/local/cvsroot1 checkout netants 采用口令校验方式时,需要对修改系统文件/etc/inetd.conf,以便使inetd知道如何分配、处理CVS Server的请求和响应。CVS会在源码库所在的目录中创建一个名为passwd的口令文件,对用户进行校验。使用口令校验时,CVS支持匿名登陆,而且CVS项目超级用户可以设置项目中文件的存取权限。 关于如何配置CVS使之工作在网络方式下的详细信息请参考CVS的文档。
4.2 CVS的分支和融合功能
CVS增强的目录工作方式使得CVS提供分支和融合功能。有的时候,当项目进展到一定程度时,可能需要暂时中断,去做另外一些修改和发展。例如,我们的软件原有版本为1.0,并已提交用户使用,现在正在开发2.0。某一天,1.0的用户发现了一个较大的bug或者需要添加某个短小的功能,这时我们不能让用户去期待2.0版本,又必须给用户满意的答复,比较理想的解决方式是把现在的工作先放到一边,另开一个分支,去满足用户的需要。当此分支完成后,程序源还可以使用CVS的融合功能将这一部分修改添加到我们开发2.0版本的主工作进程中去。 创建分支可以使用tag -b命令。例如下面的命令 cvs tag -b netants-1-0-patch 在当前的工作目录的基础上创建一个叫做netant-1-0-patch的分支。 融合的命令参数是-j,我们在前面已经提及它了。
4.3 CVS处理二进制文件的功能
CVS可以保存二进制文件,但和文本文件相比,它的许多功能丧失了。对于文本文件,CVS可以辨别出文件的任何一点改动,但对于二进制文件它无能为力。但是,CVS可以区分出文件作了改动,并会提示用户自己修改、保存。与文本文件不同,CVS保存二进制文件每个版本的完整信息。在操作二进制文件时,需要添加参数-KB,以便告诉CVS不把它当作文本文件看待。
4.4 CVS比较文件的功能
执行的命令为diff,这个功能和shell下的diff功能基本一样。例如下面的命令比较CVS源码库中的最新的netants.c文件和当前目录下netants.c文件有什么不同: cvs diff netatns.c
5.结束语 通过上面的介绍,希望能激起大家使用CVS的兴趣,并掌握使用CVS的一些基本方法。碰到困难时,别忘了翻阅CVS附带的手册,不过,它有厚厚的172页。希望CVS能加速你的软件开发。
CVS - Concurrent Versions System(并发版本管理系统)是一个版本控制管理系统,它是目前最为广泛使用的一个系统。从gftp到gtk到KDE,你几乎可以在每一个你熟悉的自由软件的源码里看到它的踪迹(下面我们会知道,它的踪迹指一个称为cvs的子目录)。同样,你也可以在几乎每一个Linux的发行版本里看到CVS系统。可以说,如果失去了CVS,现有的许多多人协作、自由开发的软件都会在一定程度上放慢自己发展的步伐。
CVS到底有哪些功能,使得它有如此强大的魅力呢?
1.CVS能做什么?
如上所说,CVS首先是一个版本管理系统,它可以保留软件开发过程中的每一个版本的信息,包括谁、在何时、作了什么样的修改以及为什么作这样的修改等。这个功能和以前流行于Linux和Unix的版本管理系统RCS(Revision Control System)和SCCS(Source Code Control System)很象。但CVS的功能远非仅此。它的最大的特点是它的并发性,即它支持分布式项目的开发。在互联网席卷一切的今天,这个功能太为重要了。小到一个办公室内部开发一个OA系统,大到KDE小组利用互联网开发新版本的KDE,CVS都可以一展身手。一个程序员开发出了自己负责模块的新版本后,迅速的通过CVS让开发组的每一个成员都分享自己的最新成果。甚至,CVS通过特定的机制允许多个程序员同时修改同一个源程序文件。
另外CVS增强的目录结构以及对二进制文件良好的处理,都使得它远远优于其它的版本管理系统。最后,必须一提的是CVS是基于RCS开发而成的。
2.如何得到CVS?
1.CVS能做什么?
如上所说,CVS首先是一个版本管理系统,它可以保留软件开发过程中的每一个版本的信息,包括谁、在何时、作了什么样的修改以及为什么作这样的修改等。这个功能和以前流行于Linux和Unix的版本管理系统RCS(Revision Control System)和SCCS(Source Code Control System)很象。但CVS的功能远非仅此。它的最大的特点是它的并发性,即它支持分布式项目的开发。在互联网席卷一切的今天,这个功能太为重要了。小到一个办公室内部开发一个OA系统,大到KDE小组利用互联网开发新版本的KDE,CVS都可以一展身手。一个程序员开发出了自己负责模块的新版本后,迅速的通过CVS让开发组的每一个成员都分享自己的最新成果。甚至,CVS通过特定的机制允许多个程序员同时修改同一个源程序文件。
另外CVS增强的目录结构以及对二进制文件良好的处理,都使得它远远优于其它的版本管理系统。最后,必须一提的是CVS是基于RCS开发而成的。
2.如何得到CVS?
CVS在几乎包含在所有的Linux发布版本中,如RedHat、Turbo Linux、Slackware以及国产的红旗、Xteam Linux等。你可以试着敲一下cvs命令,大多数情况下都会出现以Usage: cvs开头的一堆信息,提示你如何使用cvs,这意味着在你的机器上早已有了CVS,只是遗憾的是它一直未被你发现和利用。运气不好的话,你会看到形如cvs: Command not found.的提示,这意味着你的机器没有安装CVS。这时你有两种选择。一是找到你的Linux安装盘,从那里安装CVS。例如在使用RPM方式安装的Linux(上面介绍的几个发布版本中似乎除了Slackware,其他都是)发布版本中,找到cvs***.rpm,用rpm命令进行安装。第二种方式是到一些站点cvs的源代码,然后遵循里面附带的指导进行安装。
3.CVS的基本使用方法
在这一节里,我们来学习掌握CVS的一些基本使用方法。现在我们假定已经安装好了CVS,并且我们打算用它来管理自己正在开发的一个软件,软件名叫netants,它存放在硬盘上一个叫做netants的目录里,目前里面有了文件netants.c、netants.h、http.c、http.h和Makefile。我们并没有和它人协作开发这个软件,也没有利用Internet或者Intranet来开发这个软件。或许,它只是自己的一个业余作品,试图写出一个比Windows下的网络蚂蚁更好的下载工具出来。
3.1初始化CVS
我们首先要使用的命令是cvs init,这个命令用来初始化CVS系统。正如我们所看到的,所有的CVS命令都以cvs开头,然后在后面紧跟命令、参数和一些选项。初始化CVS系统主要是为了创建一个为CVS所使用的源码储存库(repository)。创建的时候,需要指定在那个目录下创建这个源码储存库。有两种方法来指定目录。一是利用"-d "选项来指定,例如:-d /usr/local/cvsroot。另一种更方便的方法是在shell里设定一个名叫CVSROOT的环境变量。使用csh或者tcsh的用户可以使用命令setenv来设定,在文件.csh rc或者文件.tcshrc里添加入下的一行: setenv CVSROOT /usr/local/cvsroot 使用sh或者bash的用户需要在文件.profile或者文件.bashrc里添加如下两行: CVSROOT=/usr/local/cvsroot export CVSROOT 设置了环境变量CVSROOT后,我们运行命令cvs init,CVS将在指定的目录下面建立自己所需要的一些文件,以后我们使用CVS管理的任何项目,都会被CVS储存在这个目录之下。不过千万要注意的是:永远不要去试图修改这个目录下的文件。这个目录是由CVS自己进行管理的,轻率的改动可能会导致你丢失你部分或全部的交由CVS管理的源代码或其他资源。
3.2导入项目到CVS中去
初始化结束以后,我们就要真正开始利用CVS来管理自己的程序网络蚂蚁了。第一步,我们将这个项目交由CVS管理。使用如下的CVS的import命令,将源程序导入到CVS的源码储存库中去: cd netants cvs import -m "start my project: Netants" netants yoyo start 这个命令看起来有些复杂,需要解释一下。import是cvs的导入命令,默认状况下,它循环的将当前目录下的所有文件(包括子目录)导入到源码库(即CVSROOT指定的目录)里去。-m "start my project: Netants"告诉CVS你对这一步操作的说明。这是CVS强制要求的,如果你没有使用这种-m "字符串"的选项,CVS将会弹出一个文本编辑器(如果自己不特别指定的话,在Linux下一般是vi,而在Windows下则是Notepad),让你输入一些说明信息它才罢休。netants是这个项目被CVS存储时的路径名,即CVS将在创建一个$CVSROOT/netants的目录,并在此目录下存放此项目的文件,当然,它不是原封不动的存储,CVS会做一番处理。最后两个字符串设定了两个标记(tag),现在并没有什么用处,但它们同样是CVS指定必需的,所以我们添上这两个参数。执行此命令时,CVS自动将所有的文件版本设为1.1,这是它所认为的最低版本。以下为执行上述命令后的显示信息:N netants/netants.c N netants/http.c N netants/http.h N netants/netants.h N netants/Makefile No conflicts created by this import N表示New,CVS成功的加载了这些文件,并没有发现冲突。 上面的命令稍长了一些,而且显得有些繁琐,相信我,CVS不总是这样的,这点"繁琐"相对它给我们带来的便利是完全可以忽略不计的。
3.3从CVS中导出项目
好了,我们把自己的netants的项目交给了CVS去管理,现在,我们完全可以删除原有的存储我们代码的netants目录(当然,安全起见,你或许应该再做一次备份,并希望是最后一次)。我们要进行开发工作了,建一个目录,叫什么呢,就叫worktmp吧。我们进到此目录下,执行命令cvs checkout netants,我们将会看到如下的信息:cvs checkout: Updating netants U netants/Makefile U netants/http.c U netants/http.h U netants/netants.c U netants/netants.h CVS在当前目录下建立一个叫做netants的目录,我们原先的代码文件都在这个目录下出现了,而且还多了一个名为CVS的目录。目录CVS下面存放的是一些文本文件,记录了CVSROOT的位置、此项目对应源码库中那个目录等一些信息。
3.4保存修改到CVS中
现在,我们开始艰苦卓越的编程工作。经过数十分钟、数小时乃至数天的工作,我们对原有的代码做了较大的修改,现在要告一段落了。我们将修改的内容提交给CVS,于是,我们需要执行命令 cvs commit -m "Made some useful changes on some files" 这时,我们将会看到CVS给出一些提示信息,它扫描并比较此目录下的现有文件和它在源码库中保存的原有文件,做了修改的文件将被更新,并且有了新的版本号:1.2。-m参数如同前面所说,是为了不想它启动一个文本编辑器来让自己输入。如果我们仅是修改了其中一两个文件,我们可以在上面的命令的最后附上文件名,这样CVS只会比较、更新指定的文件。注意的是,和自己做备份不同,CVS只是保存了不同版本之间的差异,并没有完整的保存各个版本。现在,你是不是觉得CVS有点用处了。
3.5添加文件到项目中
有一天,我们开始考虑给我们的网络蚂蚁加上从ftp站点下载文件的功能,于是,我们需要在原有的项目里添加两个文件:ftp.c和ftp.h。首先,我们在工作目录下建立并编辑、修改、生成了这两个文件,然后我们使用命令add命令来添加。 cvs add ftp.c ftp.h 此时,文件并没有真正的被添加,只是相当于"注册"了一下,要使这个过程生效,我们仍然需要使用commit命令: cvs commit ftp.c ftp.h -m "Add two files: ftp.c and ftp.h" 此时,CVS将把这两个文件添加到项目中去,他们的版本均为初始的1.1。3.6从项目中删除文件 除了添加以外,我们有的时候可能需要删除某个文件,例如我们发现文件netants.h其实没有什么用。于是,我们执行下面几个命令来完成删除工作: rm netants.h cvs remove netants.h cvs commit netants.h -m "Delete a file." 要注意的是,CVS只是删除了当前版本的netants.h,它以前的版本依然存在,除非它恰好仅有1.1版本。
3.7设定特定版本号
经过一段时间的工作,程序已经初具规模,形成了较稳定的版本。这个时候,netants.c可能已经是5.4版本,而http.c可能是3.5版本,而我们希望将当前的代码作一个版本发布。此时,我们需要使用的是tag命令。这个命令赋予指定的一个或多个文件一个给定的文本形式的版本号。版本号必须以字母开始,可以包含数字、下划线和连接符号(-)。我们想给当前项目的所有文件赋予相同的版本号时,可以不指定文件或路径参数,CVS默认选择当前目录下所有在CVS中注册的文件(循环进子目录)。下面既是一个例子: 键入命令:cvs tag release0-1 提示信息: cvs tag: Tagging . T Makefile T ftp.c T ftp.h T http.c T http.h T netants.c 这样当前版本的所有文件都有了一个叫做release0-1的版本代号。当我们需要这个版本的时候,我们使用-r (版本代号)参数来得到指定的版本。例如命令: cvs checkout -r release0-1 netants 将在当前目录下建立netants目录,并导出所有版本代号为release0-1的文件。
3.8更新当前工作目录中的文件
这里使用的命令为update,它将比较指定的在CVS源码库中的文件和当前目录下的文件,如果CVS源码库中有更高版本的源文件,则更新当前目录下的文件。这个功能主要是多人协作开发项目时使用的,让你及时分享同伴的工作成果。但它另外一个重要的用途,同样适用于单人开发的项目。这个用途需要使用-j参数,我们看下面的例子: cvs update -j 1.5 -j 1.3 netants.c 这个命令的功能是,在当前目录的netants.c文件中,忽略从版本1.3到版本1.5所作的修改。毫无疑问,对程序员来说,这是一个非常重要的功能。因为在某个阶段我们对程序所作的修改在现在可能会被视为是无效乃至错误的,这个功能很好的解决了这个问题。在更新的过程中,CVS执行一个自动合并的过程。例如我们的工作目录中的netants.c文件版本是2.1,并且我们已经对此文件作了一番修改,而CVS源码库中的是版本2.2,此时我们执行update命令时,CVS并不是简单的将版本2.2覆盖版本2.1,而是试图将自版本2.1到版本2.2的修改添加到当前目录中的文件中去,如果它和我们刚刚所作的修改有冲突,则CVS会以字符串">>>>"表示由冲突发生,期待用户去修改。CVS拒绝接受包含有上述特定字符串的文件。下面即是一个冲突的例子:netants.c:版本号2.2,保存在CVS中……getPartFile( ); showFinished(); return(A); }……
netants:版本号2.1经过我们的修改……getPartFile( ); return(B); }……我们执行命令cvs update netants.c后,将会包含如下内容的新的netants.c:
……getPartFile( ); showFinished(); >>>>>> 2.2 }…… 除非我们做出修改并删去">>>>>>",否则在执行cvs commit的时候,netants.c将不会更新原有的2.2版本。
4.CVS的其他功能
CVS当然远不止上面所说的这些内容,这些仅是CVS的基本功能,CVS还有许多重要的功能,如上面所说的网络工作方式、支持二进制文件等。下面我们对这些功能作简单的说明。
4.1 CVS的网络工作方式
CVS的网络功能采用client-server结构,两地均需安装CVS。CVS采用rsh方式或者口令校验方式进行工作。对client端,同前面讲过的设置环境变量CVSROOT一样,用户需要设置新的环境变量CVS_SERVER,指明CVS在server上的路径,例如:/usr/local/cvsroot1。CVS的-d参数指定路径名,它后面可以用:(local或server或ext):来指明是在本地还是在异地服务器上,默认当然是在本地,正如我们在初始化CVS一节所使用的那样。下面的命令假定我们的CVS服务器为cvs.rdcps.ac.cn,用户名为crazyyao,CVS源码库在服务器的/usr/local/cvsroot1目录下,我们的工作项目还是netants,我们用rsh方式导出项目文件: cvs -d : server : crazyyao@cvs.rdcps.ac.cn :/usr/local/cvsroot1 checkout netants 采用口令校验方式时,需要对修改系统文件/etc/inetd.conf,以便使inetd知道如何分配、处理CVS Server的请求和响应。CVS会在源码库所在的目录中创建一个名为passwd的口令文件,对用户进行校验。使用口令校验时,CVS支持匿名登陆,而且CVS项目超级用户可以设置项目中文件的存取权限。 关于如何配置CVS使之工作在网络方式下的详细信息请参考CVS的文档。
4.2 CVS的分支和融合功能
CVS增强的目录工作方式使得CVS提供分支和融合功能。有的时候,当项目进展到一定程度时,可能需要暂时中断,去做另外一些修改和发展。例如,我们的软件原有版本为1.0,并已提交用户使用,现在正在开发2.0。某一天,1.0的用户发现了一个较大的bug或者需要添加某个短小的功能,这时我们不能让用户去期待2.0版本,又必须给用户满意的答复,比较理想的解决方式是把现在的工作先放到一边,另开一个分支,去满足用户的需要。当此分支完成后,程序源还可以使用CVS的融合功能将这一部分修改添加到我们开发2.0版本的主工作进程中去。 创建分支可以使用tag -b命令。例如下面的命令 cvs tag -b netants-1-0-patch 在当前的工作目录的基础上创建一个叫做netant-1-0-patch的分支。 融合的命令参数是-j,我们在前面已经提及它了。
4.3 CVS处理二进制文件的功能
CVS可以保存二进制文件,但和文本文件相比,它的许多功能丧失了。对于文本文件,CVS可以辨别出文件的任何一点改动,但对于二进制文件它无能为力。但是,CVS可以区分出文件作了改动,并会提示用户自己修改、保存。与文本文件不同,CVS保存二进制文件每个版本的完整信息。在操作二进制文件时,需要添加参数-KB,以便告诉CVS不把它当作文本文件看待。
4.4 CVS比较文件的功能
执行的命令为diff,这个功能和shell下的diff功能基本一样。例如下面的命令比较CVS源码库中的最新的netants.c文件和当前目录下netants.c文件有什么不同: cvs diff netatns.c
5.结束语 通过上面的介绍,希望能激起大家使用CVS的兴趣,并掌握使用CVS的一些基本方法。碰到困难时,别忘了翻阅CVS附带的手册,不过,它有厚厚的172页。希望CVS能加速你的软件开发。
发表评论
-
思考、学习新技术的原则和方式【转】
2014-01-02 17:50 1107http://kb.cnblogs.com/page/195 ... -
最好的程序员凡事先上谷歌搜索【转】
2013-03-07 18:07 1296我知道的最优秀的程序员是我的Framebase.io ... -
史上最最佳软件开发实践指导【转】
2013-03-07 18:06 1260“” 阅读器 软件开发 -
我所钟爱的代码审查【转】
2013-02-22 18:00 927当我从学术界转向产业界的过程中,对我生涯改变最大的事情就 ... -
高效代码审查的十个经验【转】
2013-02-22 17:59 976代码审查(Code Review)是软件开发中常用的手段,和 ... -
为什么程序员不擅长评估开发时间?[转]
2012-12-17 10:07 850一个曾经与我一起工作过的经验丰富的项目经理声称,他拿到程 ... -
给明年依然年轻的我们[转]
2012-06-28 09:18 929今天是22岁的最后一天。几个月前,我从沃顿商学院毕业,用 ... -
[转]用户交互设计UI参考书目整理
2012-01-19 15:18 1149书名 作者用户体验的要素 Jesse James Garret ... -
【转】android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】
2011-09-07 18:23 2519protobuf 是什么? Protocol ... -
【转】开源点评:Protocol Buffers介绍
2011-09-07 17:14 1171引自:http://blog.csdn.net/p ... -
google ProtoBuf开发者指南【转】
2011-09-07 17:09 2503目录 1 概览 1.1 什么是 ... -
hg clone 命令的windows解决方法TortoiseHg[转]
2011-05-11 20:50 2330hg是跟svn和cvs一样的版本管理系统。windows下 ... -
谷歌高效能经理人的8个习惯【转】
2011-03-26 12:24 1198Google's "people operati ... -
面试时不要说的7件事【转】
2011-03-26 11:55 9847 Things Not to Say During ... -
为了成功 训练自己[转]
2011-03-26 11:50 1291你是否曾见过像曼尼· ... -
在github上建立自己的开源项目
2011-03-26 00:12 1987由于代码一直在自己这保存,一方面别人看不见,也不安全。搜了下, ... -
从ant到maven -- maven pom例子(初级)转
2011-02-27 00:46 1512http://hi.baidu.com/javajiwei/b ... -
从一个男人身上看出他的修养和抱负
2011-02-15 23:07 857一、拥有自信和风度 男人到了二十几岁后,就要开始学着用心去经营 ... -
手机操作系统三国时代的结束
2011-01-11 00:19 957第一篇:Symbian正式崩盘,手机操作系统三国时代结束 ... -
如何使用搜索技巧来成为一名高效的程序员
2011-01-11 00:05 838没有人是完全独立的孤 ...
相关推荐
**CVS(Concurrent Versions System)**是一种广泛使用的版本控制系统,尤其在软件开发领域中,它扮演着...通过阅读提供的"CVS安装程序和课件",你可以深入了解CVS的安装和使用,从而更好地利用这个工具进行团队开发。
CVS(Concurrent Versions System)是一种广泛使用的源代码版本控制系统,尤其在软件开发领域中,它帮助团队协作管理和跟踪代码的变化。在这个“CVS用户管理工具”中,我们将深入探讨如何进行用户管理,包括添加、...
CVS(Concurrent Versions...总的来说,CVS是软件开发团队协作的重要工具,理解并熟练掌握其配置和使用方法,将极大地提高项目管理的效率和代码质量。通过上述步骤,你应该能够成功地设置和开始使用CVS进行文件管理了。
### CVS配置管理工具使用手册详解 #### 一、CVS简介 CVS(Concurrent Versions System),即并发版本...通过以上步骤,用户可以有效地使用TortoiseCVS来管理项目文件,提高工作效率,减少因版本控制不当带来的问题。
### CVS使用及管理文档知识点详解 #### 一、CVS简介 CVS(Concurrent Versions System),即并发版本系统,是一种广泛使用的版本控制系统。通过CVS,开发者可以追踪和管理软件项目的源代码历史记录,这对于识别引入...
总之,CVS中文版安装程序是为了方便中文用户使用版本控制工具,而WinCVS作为其客户端,提供了直观的图形界面,使得CVS在Windows环境下的使用变得更加简单易行。对于团队开发来说,掌握CVS的基本操作和管理策略是非常...
在“CVS管理及代码显示”的主题下,我们将深入探讨CVS如何与asp.net项目结合,以及如何管理和显示代码。 CVS系统的核心功能包括版本追踪、代码合并、冲突解决和历史记录查看。它允许开发人员在不同的时间点保存代码...
CVS(Concurrent Versions System)是一种广泛应用于软件开发领域的版本控制系统,它允许多个开发者在不同的地点同时对同一份代码进行修改,并能有效地管理和合并这些修改。在这个“CVS 安装程序”中,我们关注的是...
**版本管理控制器CVS** CVS(Concurrent Versions System)是一种开源的版本控制系统,它允许开发者...通过下载并安装TortoiseCVS-1.8.31.exe,用户将能够利用这个功能丰富的版本管理客户端来提升他们的项目管理能力。
TortoiseCVS-1.12.5.exe是TortoiseCVS的安装程序,用户可以通过这个可执行文件来安装该工具。安装过程中,用户可以选择安装路径,配置CVS服务器连接信息,并设置个人偏好,如是否集成到右键菜单等。安装完成后,...
【CVS版本管理系统详解】 CVS(Concurrent Versions System)是一种源代码版本控制系统,它能够跟踪文件和目录的变更,方便多人协作开发。CVSNT是CVS的一个增强版本,适用于Windows操作系统,提供了更完善的权限...
虽然"upload"不是CVS原生提供的一个特定命令,但在很多上下文中,人们常常使用这个词来表示将文件或修改上传到CVS仓库的过程。实际上,这通常是通过`cvs commit`命令实现的。在某些CVS客户端或者教程中,"upload...
【Eclipse中CVS使用详解】 CVS,全称为Concurrent ...总之,Eclipse中的CVS使用涵盖了从服务器配置到客户端操作的全过程,通过学习和实践,开发者能够有效地利用CVS进行版本管理,提高项目开发的效率和协作的顺畅度。
- 创建仓库文件夹,例如在E:\成果库,以保持与程序文件隔离,减少数据丢失风险。 - 在CVSNT控制面板的"Repository configuration"中添加仓库,指定仓库路径(如E:\成果库)。 4. **仓库初始化** - 初始化仓库会...
Cvs(Concurrent Versions System)是一种广泛使用的源代码管理工具,它允许软件开发团队协同工作,同时管理并跟踪代码的版本变化。Cvs的核心功能在于版本控制,使得开发者可以在不同的时间点保存代码的状态,方便...
总的来说,CVS配置与使用是软件开发中的重要环节,它有助于团队成员间的协同工作,提高代码管理效率,避免版本冲突,同时提供了代码历史追踪和恢复旧版本的能力。正确配置和熟练使用CVS,能够极大地提升开发效率和...
TortoiseCVS是CVS(Concurrent Versions System)的一个图形用户界面(GUI)工具,它为开发者提供了一种直观且易于使用的界面来管理版本控制。CVS是一个开源的版本控制系统,广泛应用于软件开发中,用于跟踪代码更改...
1. 下载TortoiseCVS的安装程序,如`TortoiseCVS-1.10.9.exe`。 2. 安装过程中需指定CVS服务器信息和安装路径。 3. 安装完成后,重启电脑,TortoiseCVS图标将出现在资源管理器中。 4. 使用TortoiseCVS的右键菜单进行...
本文将详细介绍如何在本地安装CVS Server,并在Eclipse中配置和使用CVS进行项目管理。 首先,让我们了解CVS Server的安装步骤: 1. **下载与准备**:你需要从官方或者可信的源获取CVS Server的安装包。确保下载的...