当前位置:操作系统 > Unix/Linux >>

用CVS来管理自己的程序

每个编写程序的人也许都有过这样的体验:对编写的程序作了一些修改,几天以后,我们可能发现上次的修改导致了其它的矛盾,甚至编译不能通过,但这时我们却很难找到自己刚在哪里作了改动。一般说来,我们总是希望自己完整的记录下一个程序开发的过程,记录下这个程序的每一点改进和调整。或许我们可以用备份的方法来解决这个问题,于是我们建立一个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?

  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的源代码,然后遵循里面附带的指导进行安装,需要的读者请访问站点http://www.cyclic.com/或者http://www.loria.fr/~molli/cvs-index.html。 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 设定特定版本号

  经过一段时间的工作,程序已经初具规模,形成了较稳定的版本。这个时候
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,