- 浏览: 540297 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1114http://kb.cnblogs.com/page/195 ... -
最好的程序员凡事先上谷歌搜索【转】
2013-03-07 18:07 1302我知道的最优秀的程序员是我的Framebase.io ... -
史上最最佳软件开发实践指导【转】
2013-03-07 18:06 1267“” 阅读器 软件开发 -
我所钟爱的代码审查【转】
2013-02-22 18:00 935当我从学术界转向产业界的过程中,对我生涯改变最大的事情就 ... -
高效代码审查的十个经验【转】
2013-02-22 17:59 979代码审查(Code Review)是软件开发中常用的手段,和 ... -
为什么程序员不擅长评估开发时间?[转]
2012-12-17 10:07 857一个曾经与我一起工作过的经验丰富的项目经理声称,他拿到程 ... -
给明年依然年轻的我们[转]
2012-06-28 09:18 936今天是22岁的最后一天。几个月前,我从沃顿商学院毕业,用 ... -
[转]用户交互设计UI参考书目整理
2012-01-19 15:18 1157书名 作者用户体验的要素 Jesse James Garret ... -
【转】android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】
2011-09-07 18:23 2526protobuf 是什么? Protocol ... -
【转】开源点评:Protocol Buffers介绍
2011-09-07 17:14 1176引自:http://blog.csdn.net/p ... -
google ProtoBuf开发者指南【转】
2011-09-07 17:09 2510目录 1 概览 1.1 什么是 ... -
hg clone 命令的windows解决方法TortoiseHg[转]
2011-05-11 20:50 2336hg是跟svn和cvs一样的版本管理系统。windows下 ... -
谷歌高效能经理人的8个习惯【转】
2011-03-26 12:24 1203Google's "people operati ... -
面试时不要说的7件事【转】
2011-03-26 11:55 9947 Things Not to Say During ... -
为了成功 训练自己[转]
2011-03-26 11:50 1295你是否曾见过像曼尼· ... -
在github上建立自己的开源项目
2011-03-26 00:12 1995由于代码一直在自己这保存,一方面别人看不见,也不安全。搜了下, ... -
从ant到maven -- maven pom例子(初级)转
2011-02-27 00:46 1531http://hi.baidu.com/javajiwei/b ... -
从一个男人身上看出他的修养和抱负
2011-02-15 23:07 861一、拥有自信和风度 男人到了二十几岁后,就要开始学着用心去经营 ... -
手机操作系统三国时代的结束
2011-01-11 00:19 962第一篇:Symbian正式崩盘,手机操作系统三国时代结束 ... -
如何使用搜索技巧来成为一名高效的程序员
2011-01-11 00:05 847没有人是完全独立的孤 ...
相关推荐
ztsc_109339.apk
永磁同步电机的高频正弦电压注入的速度观测,Simulink,PMSM,高频正弦。
智慧燃气发展研究报告
如何通过智能卡读写器SDK接入鸿蒙操作系统?通过智能卡读写器提供的SDK范例可以将智能卡读写器接入在运行鸿蒙操作系统的智能终端设备上。
谭浩强编写的《C程序设计(第五版)》PPT、书中源码、习题答案以及习题库
人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。
分布式驱动汽车稳定性控制。 采用分层式直接横摆力矩控制,上层滑模控制,下层基于轮胎滑移率最优分配。 滑模控制跟踪横摆角速度和质心侧偏角误差。 七自由度整车模型输出实际质心侧偏角和横摆角速度,二自由度模型输出理想质心侧偏角和横摆角速度。 附m文件,有参考文献和说明文档
注意:此文档为最终版本,方便大家记录,但更新主要还是在博客更新
汇川.H5U框架程序,汇川TIT700系列触摸屏框架程序 1.汇川H5U-A8系列cpu 自制封装多个FB功能块程序,轴控制功能块,气缸动作报警功能块,XY矩阵功能块,等等。 只需写动作步序,其他全部调用FB 和HMI可以无实物仿真 仿真HMI地址127.0.0.1 A1349.H5U原框架
学生作业-作业打卡盖章。该项目为html前端项目,依据学生作业提交情况,通过点击名字进行打卡盖章。涉及html、js、css,其中js中涉及监听函数;窗口中的列表数据来源于data.jso,可自行修改
Spring面试专题.pdf
2025年蓝色简约时尚婚礼邀请函模板
深层过滤纸板是一种由纤维素材料制成的平板或薄片,具有过滤液体或气体的能力。它通常由纤维素纤维(如木浆)经过湿法造纸工艺制成,形成一张薄而均匀的纸板。深层过滤纸板设计用于过滤任何类型的液体,包括葡萄酒、油、啤酒和果汁等,广泛应用于食品饮料、制药、化工等领域。 随着酿酒行业和饮料行业的不断壮大,对深层过滤纸板的需求也在增加。深层过滤纸板常用于过滤液体中的杂质和固体颗粒,确保产品的质量和纯度。因此,这些行业的发展推动了过滤纸板的需求。为了满足酿酒行业和饮料行业对过滤效果、速度和成本的不断追求,深层过滤纸板制造商进行了技术创新和改进。他们不断改良过滤纸板的材料、结构和制造工艺,以提高其过滤效率和性能,同时降低生产成本。环保意识的提升推动了过滤纸板行业朝着绿色、可持续发展的方向发展。包括可降解材料的应用,再生纤维的使用以及生产过程的绿色化都是行业发展的趋势。 目前在全球范围内,工业化的发展仍处于高速阶段,企业在生产过程中要求更高的过滤处理标准,从而促进了深层过滤纸板行业的发展。随着生物技术产业的发展,越来越多的实验室需要使用过滤纸板进行细胞和菌群的分离,同时也需要更高精度的滤料来处理许多疾病的检
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
easy-interceptor修改请求头和响应头.zip
代码复现;冷热电气多门互补的微能源网鲁棒优化调度MATLAB复现 随着能源结构调整,集成风/光等可再生能源输入、冷热电气等多种能源互补输出的微能源网得到了逐步发展,如何协调调度微能源网内冷热电气源网荷成为当前研究热点。 建立了冷热电气多能互补的微能源网在孤岛/并网模式下的协调调度模型,并利用供热/供冷系统的热惯性和热/冷负荷的柔性,发挥供热/供冷系统的“储能”功能,以电转气(P2G)装置实现电—气网络双向互通。 模型采用鲁棒线性优化理论将随机优化模型进行确定性转化,取得经济性和鲁棒性的适当折中。 算例仿真验证了温度负荷储能特性对微能源网灵活调度的优化作用和鲁棒性指标对优化结果的协 调作用。 关键词:微能源网;多能互补;温度负荷;储能特性;鲁棒优化
三电平T型变器双闭环PI控制-调制实现在60度坐标系 变器 减少了普通SVPWM的矢量计算时间,在60度坐标系完成高效计算,控制效果很好。 可以发参考资料
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
箱线图(Box Plot)是一种用于展示数据分布的图形工具,能够有效地显示数据的集中趋势和离散程度。以下是箱线图的主要特点和组成部分: 主要特点 数据分布:箱线图可以清晰地展示数据的中位数、四分位数和潜在的异常值。 多组比较:可以将多组数据在同一张图中进行可视化,便于比较不同组之间的差异。 易于理解:由于其结构清晰,读取和理解相对简单。 使用场景 数据分析:用于探讨数据的分布和变化,识别异常值。 统计总结:在数据报告和研究中,用于直观表达数据特征。
ChromeDriver 是一个用于自动化 Chrome 浏览器的工具,它是由 Selenium WebDriver 提供支持的。在测试领域,尤其是Web应用程序的自动化测试中,ChromeDriver扮演着至关重要的角色。标题"chromedriver version 118.0.5993.70"表明这是 ChromeDriver 的一个特定版本,版本号为118.0.5993.70,通常这样的更新会带来性能优化、新功能以及对Chrome浏览器新版本的支持。 描述中的“chromedriver测试版本”意味着这可能是一个用于测试目的的构建,可能包含了最新的改进或者尚未广泛发布的特性。开发者和测试工程师会使用这样的测试版本来确保他们的自动化测试脚本能够兼容即将推出的 ChromeDriver 正式版本。 标签“测试 chromedriver”进一步强调了该软件在测试环境中的应用,特别是与 Chrome 浏览器的自动化测试相关的场景。ChromeDriver 允许测试人员通过编写 Selen。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。