`

用CVS来管理自己的程序

阅读更多
用CVS来管理自己的程序


来源: ChinaUnix博客  日期: 2005.01.31 11:46 (共有0条评论) 我要评论
 
转自chinaunix,另一篇CVS比较详细的帮助文摘。
用CVS来管理自己的程序
本文出自:http://www.china-pub.com 作者: 姚继锋 (2001-08-09 15:00:00)
每个编写程序的人也许都有过这样的体验:对编写的程序作了一些修改,几天以后,我们可能发现上次的修改导致了其它的矛盾,甚至编译不能通过,但这时我们却
很难找到自己刚在哪里作了改动。一般说来,我们总是希望自己完整的记录下一个程序开发的过程,记录下这个程序的每一点改进和调整。或许我们可以用备份的方
法来解决这个问题,于是我们建立一个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 设定特定版本号
  经过一段时间的工作,程序已经初具规模,形成了较稳定的版本。这个时候,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用户管理工具

    CVS用户管理工作。添加,删除用户,修改密码。。。。 用户可以通过命令。与Java-GUI图开用户界面。两种方式来管理

    乌龟版 CVS 客户端

    CVS 的基本工作思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放...用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由 cvs 仓库管理员统一修改.这样就可以做到跟踪文件变化,冲突控制等等.

    TortoiseCVS-1.8.18

    TortoiseCVS 是一款项目管理工具,一般用在IT行业,有服务器版和客户端版,在客户机上装了CVS,能够从服务器上迁出数据 。是Windows平台上最最简单最最方便的CVS工具,TortoiseCVS的特点就是完全结合到资源管理器的...

    CVS命令解析

    CVS 是 Concurrent Version System(并行版本系统)的缩写,用于版本管理...用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由 cvs 仓库管理员统一 修改。这样就可以做到跟踪文件变化,冲突控制等等。

    CVS的基本工作思路

    每个用户在使用源代码库之前,首先要把源代码库里的项目文件下载到本地,然后用户可以在本地任意修改,最后用CVS命令进行提交,由CVS源代码库统一管理修改。这样,就好像只有一个人在修改文件一样,既避免了冲突,又...

    CVS服务器快速指南

    用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由 cvs 仓库管理员统一 修改.这样就可以做到跟踪文件变化,冲突控制等等.  由于 CVS 是典型的 C/S 结构的软件,因此它也分成服务器端和客户端两...

    cvs-inv-mgmt:CVS库存管理应用程序

    cvs-inv-mgmt:CVS库存管理应用程序

    CVS手册

    CVS 是 Concurrent Version System(并行版本系统)的缩写,用于版本管理...用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由 cvs 仓库管理员统一 修改。这样就可以做到跟踪文件变化,冲突控制等等。

    linux cvs的配置全攻略

    CVS 是 Concurrent Version System(并行版本系统)的缩写,用于版本管理...用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由 cvs 仓库管理员统一 修改。这样就可以做到跟踪文件变化,冲突控制等等。

    TortoiseCVS-1.12.5(含中语言包)

    TortoiseCVS 是一款项目管理工具,一般用在IT行业,有服务器版和客户端版,在客户机上装了CVS,能够从服务器上迁出数据 。是Windows平台上最最简单最最方便的CVS工具,TortoiseCVS的特点就是完全结合到资源管理器的...

    CVS 配置手册(带图)

    CVS 安装配置使用 带图 简述: CVS (Concurrent Version System),可翻译成并行版本系统,它主要用于版本的管理,尤其在多人团队合作的开发模式中作用巨大。在团队合作开发中,要对整个项目的各个文件进行控制是...

    cvsnt&TortoiseCVS

    CVS 是 Concurrent Version System(并行版本系统)的缩写,用于版本管理.如果大家曾经参与过多人协作开发的项目,大家肯定有这样的痛苦经历:由于多个人同时修改同一个文件,自己辛辛苦苦修改的程序被别人彻底删除...

    CVS中文完美稳定版(服务器和客户端)

    包含完整的cvsnt 2.5.03服务器包含完美中文版的1.3.13.2WinCVS客户端包含详细配置教程,包含详细 CVS使用教程以上程序全部运行于windows系统

    TortoiseCVS

    TortoiseCVS 是一款项目管理工具,一般用在IT行业,有服务器版和客户端版,在客户机上装了CVS,能够从服务器上迁出数据 。是Windows平台上最最简单最最方便的CVS工具,TortoiseCVS的特点就是完全结合到资源管理器的...

    windows CVSNT 安装包

    注意,这里的administrator是当前windows用户名,既run as中选择的那个,/tarena/cvs是之前添加的CVS仓库的别名,如果你的设置不同,请把它们替换成自己的值,以后不再说明。 接着cvs login命令登录CVS服务器,会...

    Linux编程基础(详细).ppt

    通过对本章的学习,读者应该掌握以下主要内容: Ø Linux编程风格 Ø Linux下IDE的使用 Ø Linux下使用GNU cc开发应用程序 Ø Linux程序的调试 Ø Linux下使用RCS/CVS来管理源程序 Ø Linux下软件打包

    微信外卖小程序源码实例.rar

     1、导入db文件夹中的数据到Bmob,导入方法是手工建表,然后选择导入cvs,,注意:对于Pointer类型的字段要通过手工建立,Bmob目前暂不支持Pointer字段导入,对于其他类型字段在导出时参照下方类型手工更正,否则...

    Linux程序设计 第4版.haozip01

    13.6.2 高级主题:使用fifo的客户/服务器应用程序 464 13.7 cd数据库应用程序 468 13.7.1 目标 469 13.7.2 实现 469 13.7.3 客户接口函数 472 13.7.4 服务器接口server.c 478 13.7.5 管道 481 13.7.6 对cd...

    PHP基于Web的subversion用户管理系统(源代码+论文).zip

    在开源软件世界,并行版本系统(cvs)一直是版本控制长久以来的唯一选择,但是,和其它许多工具一样,cvs开始显露出衰老的迹象,而subversion,正是以cvs继任者的面目出现的新型版本控制系统。但是,它的用户管理机制...

    Linux程序设计 第4版.haozip02

    13.6.2 高级主题:使用fifo的客户/服务器应用程序 464 13.7 cd数据库应用程序 468 13.7.1 目标 469 13.7.2 实现 469 13.7.3 客户接口函数 472 13.7.4 服务器接口server.c 478 13.7.5 管道 481 13.7.6 对cd...

Global site tag (gtag.js) - Google Analytics