`
晨星★~雨泪
  • 浏览: 448201 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

CVS进行项目开发管理

阅读更多

使用CVS进行项目开发管理

来源:本文出自:http://www.swm.com.cn 作者:张云帆 (2001-11-06 07:00:00)

<!---->在多人共同开发一个大型项目时,源代码的维护和版本维护是一件令人头疼的事情,由于多人开发,
每个开发人员都拥有此项目的副本,所以如果要手动维护同一个文件多人的修改是十分困难的事情。
另外,可能你需要的项目的版本不是当前开发的最新的版本, 如果为了这个目的而为每一个版本
保留一个备份几乎是不可能的。Linux平台上提供了一个功能软件:CVS。众所周知,Linux的发展
得益于互联网的发展,大部分的软件都是众多开发者在互联网上共同开发的,这些软件的维护大部
分都使用CVS,例如Deban Linux的开发、KDE的开发,以及sourceforg上的开发项目。正确熟练使
用CVS是一个Linux程序员基本的素质。


CVS不仅可以维护源代码,事实上,所有的文本文件都可以使用CVS来管理,当然也可以管理 二进
制文件,只是需要特殊的命令选项罢了。

CVS把文件保存在一个名叫仓库(repository)的地方,仓库中保存的文件并不是每个版本的副本,
而是可以从任意版本回溯到初始版本的一些代码的主控信息,这样,就节省了大量的存储空间。
仓库不仅可以建立在本机上,也可以建立在网络上。另外CVS支持版本分支(tag),这样可以从
任意的版本中衍生出另外一个版本进行开发,必要时,还可以把这个分支合并到主开发分支去。

CVS需要一个名叫RCS(修订控制系统)的软件,确切说,CVS主要管理开发项目中的目录的改动,
而RCS则侧重于管理的一个文件的改变。如果要使用网络的CVS,还需要rsh或者自己内置的
cvs-server,rsh是CVS客户于服务器的通信平台,如果需要安全的信息传输,可以使用ssh,
这个可以使用CVS_RSH环境变量来指定:
export CVS_RSH=rsh 使用rsh
export CVS_RSH=ssh 使用ssh

RCS使用
在使用CVS之前,先介绍一下RCS的使用方法。
正如前面所说,RCS是针对某一个特定的文件进行管理,常用到的命令是co和ci。RCS使用当 前工
作路径下的RCS目录来存储管理的文件。
ci (check in)把源代码加入到RCS源代码仓库中,每一个添加进代码库中的文件的版本是 1.1。
以后每次修改文件重新ci以后,此文件的版本递增为1.2 ,1.3.……。
co(check out)把源文件从RCS源代码仓库中取出,缺省的版本是最新的版本,如果你需要一个
指定的版本,则需要使用-r选项指定。例如:
$mkdir RCS 建立RCS源代码仓库
编辑一个文件,如hello.c
#include <stdio.h>
int main (void)
{
printf ("Hello World\n");
return 0;
}
然后把它加入到RCS仓库中:
[kerberos@power zhyf]$ ci hello.c
RCS/hello.c,v <-- hello.c
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>>the inital verion. 输入关于文件改动的信息
>> . 以.结束信息输入
initial revision: 1.1 初始版本是1.1
done
[kerberos@power zhyf]$
当文件加入到源代码仓库后,RCS会自动删除文件。

如果需要修改文件,则从仓库取出:
[kerberos@power zhyf]$ co hello.c
RCS/hello.c,v --> hello.c
revision 1.1
done
此时,取出的文件是只读的,如果需要编辑文件,需要对文件加锁取出,防止与他人编辑冲突。 
加锁取出使用-l (lock)选项。
[kerberos@power zhyf]$ co -l hello.c
RCS/hello.c,v --> hello.c 从RCS仓库中取出hello.c,仓库中的文件是以v结尾的。
revision 1.1 (locked) 指明是加锁取出
done
这时,我们就可以修改和编辑文件了。
例如:
#include <stdio.h>
int main (void)
{
printf ("Hello World\n");
printf("checkoutwithlock\n"); 添入代码
return 0;
}
[kerberos@power zhyf]$ ci hello.c
RCS/hello.c,v <-- hello.c
new revision: 1.2; previous revision: 1.1 重新加入到仓库,文件版本递增为1.2
enter log message, terminated with single '.' or end of file:
>> check out with lock and modified it .
>> .
done
如果你需要先前的hello.c,也就是1.1版本的,可以使用-r来指定取出文件的版本:
[kerberos@power zhyf]$ co -l -r1.1 hello.c
hello.c,v --> hello.c
revision 1.1 (locked) 取出1.1版本
done
可以尝试使用两次加锁取出,这时候,RCS会提示警告信息。
[kerberos@power zhyf]$ co -l hello.c
hello.c,v --> hello.c
revision 1.1 (locked)
writable hello.c exists; remove it? [ny](n) 是否覆盖当前的hello.c
如果回答n,则取出失败,回答是则覆盖当前文件
与-l相反的选项是-u,取出不加锁的文件用于工作。-f则在ci时强制覆盖RCS仓库中的文件,
 在co时强制覆盖当前的文件。 

在RCS中,支持类似于宏的关键字,在ci后,这些关键字会被RCS替换成特定的信息,
如$Id$关键字:
/*$Id
*/
#include <stdio.h>
int main (void)
{
printf ("Hello World\n");
printf("checkoutwithlock\n");
return 0;
}
ci 之后,然后取出,文件将变成:
/*$Id: hello.c,v 1.3 2001/02/22 16:16:58 kerberos Exp kerberos $
*/
#include <stdio.h>
int main (void)
{
printf ("Hello World\n");
printf ("check out with lock\n");
return 0;
}
$Id$ 关键字是用文件名、版本、时间、作者 及代码性质替换,如果使用-l选项取出,在Exp后
面会加上登录用户的名称。除了$Id$关键字,RCS还支持下面常用的关键字:
$Log$ : 你所提供的修改日志信息。
$Author$ :存入该版本的作者。
$Locker$ : 该版本的加锁者
$State$ : 该版本的状态 Exp(试验版), Stabe(稳定版), Rel(发行版).缺省是Exp
$Date$ : 该版本存入的时间,使用UTC时间格式。
$Revision$ : 该版本的版本号
$RCSfile$ : RCS文件名
$Source$ : RCS全路径名
$Name$ : 取回该版本的符号名
$Header$ : 相当于$ Source $$ Revision$$Date$$Author $$State$$Locker$的组合
在UNIX/Linux下有一个diff工具可以比较两个文件的不同,rcsdiff可以在不同的版本之间比
较文件的不同,而不必取出文件,如:
rcsdiff hello.c 比较当前hello.c文件与RCS仓库中最新版本的区别。
rcsdiff -r1.1 hello.c 比较当前hello.c文件与hello.c的1.1版本的区别。
rcsdiff -r1.2 -r1.1 比较hello.c 文件的1.1版本和1.2版本的区别。
使用这个命令,可以很方便的做出任意版本之间的补丁文件。
另外,还有其他一些不常用的RCS命令,读者可以参考更详细的资料。

CVS使用
下面我们就讲一下CVS的使用和管理。

在使用CVS之前,必须要指定CVS的根路径,不像RCS是工作在工作目录下的RCS目录下。指定
CVS路径的方法有两种,一种是使用cvs-d 选项指定,如:
cvs -d /home/kerberos/cvsroot 指定/home/kerberos/cvsroot为CVS仓库的路径。
另外一种是使用CVSROOT环境变量指定(bash下):
export CVSROOT=/home/kerberos/cvsroot

无论何种方式,每当重新开启一次终端会话,CVS仓库的路径都要重新设置,你可以把以上的
后者加入到其实目录下的.bashrc文件中,这样开启一次终端会话后,不需要重新设置了(对
于其他的环境变量的设置也是如此)。如果你的CVSROOT环境变量已经存在,可以使用cvs -d 
选项来指定不同于CVSROOT所指定的CVS仓库。然后初始化CVS仓库,建立CVS维护所需要的一些
文件和信息,CVS把这些信息存放在CVS仓库主目录的CVSROOT目录下。这些文件,除了modules ,
其他文件都没有手动修改的必要,modules 文件定义了CVS的导出模块在CVS仓库中的位置,
这一点在从CVS仓库中导出一个深层目录时是非常方便的。

cvs init
初始化之后,我们使用cvs import来把需要进行版本维护的开发项目的目录结构导入到CVS仓
库中,如下:
建立好项目的目录结构以后,当前的testprj目录的结构是这样的:

[kerberos@power zhyf]$ tree testprj
testprj
|-- admin
|-- doc
|-- include
|-- libs
`-- src
|-- include
`-- main

7 directories, 0 files
cvs import有三个参数:第一个是这个目录树在CVS仓库中的模块名称,第二个是发布者的一个
标志,第三个是这个项目的版本标记(tag)。下面,我们把testprj导入到CVS仓库中,使用
testprj 模块名称。
[kerberos@power testprj]$cvs import testprj KERBEROS INITVER

执行命令以后,CVS会调用CVSEDITOR指定的编辑器来让你输入日志,如果CVSEDITOR没有定义,
缺省调用vi,可以使用export命令指定你自己喜欢使用的编辑器。输入日志以后,CVS把当前的
目录结构导入CVS仓库中,并且使用testprj这个模块名称,在导出文件时,就可以使用
cvs co testprj 来导出。
"/tmp/cvscVxZnW" 5L, 242C written
cvs import: Importing /home/zhyf/cvsroot/testprj/admin
cvs import: Importing /home/zhyf/cvsroot/testprj/libs
cvs import: Importing /home/zhyf/cvsroot/testprj/src
cvs import: Importing /home/zhyf/cvsroot/testprj/src/include
cvs import: Importing /home/zhyf/cvsroot/testprj/src/main
cvs import: Importing /home/zhyf/cvsroot/testprj/doc
cvs import: Importing /home/zhyf/cvsroot/testprj/include

No conflicts created by this import

看一下cvsroot目录中的结构是不是和testprj 的相同:


../cvsroot
|-- CVSROOT
| |-- checkoutlist
| |-- checkoutlist,v
| ........................... CVS的仓库信息,省略..
| ...........................
`-- testprj
|-- admin
|-- doc
|-- include
|-- libs
`-- src
|-- include
`-- main

这里testprj 模块的结构和我们自己的testprj的目录结构是一样的。
这样,当需要再次使用这些源代码时,就可以简单的使用cvs co模块名来导出目录树和文
件了。导出任意具有写权限的目录下:
[kerberos@power testprj]$ cd ..
[kerberos@power zhyf]$ rm -rf testprj 删除testprj目录
[kerberos@power zhyf]$ cvs co testprj 重新导出
cvs checkout: Updating testprj
cvs checkout: Updating testprj/admin
cvs checkout: Updating testprj/doc
cvs checkout: Updating testprj/include
cvs checkout: Updating testprj/libs
cvs checkout: Updating testprj/src
cvs checkout: Updating testprj/src/include
cvs checkout: Updating testprj/src/main
[kerberos@power zhyf]$ tree testprj
testprj
|-- CVS
| |-- Entries
| |-- Repository
| `-- Root
|-- admin
| `-- CVS
| |-- Entries
| |-- Repository
| `-- Root
|-- doc
| `-- CVS
| |-- Entries
| |-- Repository
| `-- Root
|-- include
| `-- CVS
| |-- Entries
| |-- Repository
| `-- Root
|-- libs
| `-- CVS
| |-- Entries
| |-- Repository
| `-- Root
`-- src
|-- CVS
| |-- Entries
| |-- Repository
| `-- Root
|-- include
| `-- CVS
| |-- Entries
| |-- Repository
| `-- Root
`-- main
`-- CVS
|-- Entries
|-- Repository
`-- Root

CVS在每个目录下面都建立了一个名叫CVS的目录,此外,目录的结构是一样的,事实上,
CVS目录中存放的是一些关于目录结构在仓库中的信息,Entries中包含了这些目录中的子目录,
Respository包含此目录在仓库中的相对位置,ROOT包含导出的模块主目录的绝对路径。

cvs import命令只是在第一次把项目导入CVS仓库时才使用,以后如果再需要加入目录或者加入
文件,则使用cvs add 命令加入,然后使用cvs commit提交之后,文件或者目录才会真正加入到
CVS仓库中。我们可以把刚才编辑的hello.c文件拷贝到testprj/src/main/中,然后使用:
[kerberos@power zhyf]$ cvs add testprj/src/main/hello.c
cvs add: scheduling file `testprj/src/main/hello.c' for addition
cvs add: use 'cvs commit' to add this file permanently

使用cvs commit提交修改
[kerberos@power zhyf]$ cvs commit
cvs commit: Examining testprj
cvs commit: Examining testprj/admin
cvs commit: Examining testprj/doc
cvs commit: Examining testprj/include
cvs commit: Examining testprj/libs
cvs commit: Examining testprj/src
cvs commit: Examining testprj/src/include
cvs commit: Examining testprj/src/main
RCS file: /home/zhyf/cvsroot/testprj/src/main/hello.c,v
done
Checking in testprj/src/main/hello.c;
/home/zhyf/cvsroot/testprj/src/main/hello.c,v <-- hello.c
initial revision: 1.1

使用RCS管理单个文件
done

testprj/src/main/hello.c

由于CVS使用RCS管理单个文件,所以,前面我们讲的关于RCS的知识也可以用到这里,唯一不同的
是命令之前要限定是cvs,比如cvs ci, cvs co, cvs diff, 或者在导出时使用 -r 选项指定导出的
文件的版本。在源代码文件中,同样也可以使用RCS的关键字。
对于非ASCII文件,如二进制可执行文件,位图等文件,我们不能直接使用cvs add
加入到CVS仓库中,因为CVS只是基于ASCII代码比较文件的改变,所以,对于二进制文件,如果单
纯使用cvs add 命令会破坏文件的完整,所在加入二进制文件时,要指定-kb参数。如果对已有文
件进行了修改,使用cvs ci, cvs commit 来提交修改。
另外一种情况是自己导出别人修改的文件,而不想覆盖自己所作的修改,可以使用cvs update命令,
这个命令会自动比较CVS仓库中文件和当前自己文件的最后修改时间来导出最新的文件。

在cvs update 和cvs ci 时,你对此的文件修改与他人发生冲突,CVS则提示你。CVS会在文件中使
用“>>>>>>” 或者“<<<<<<<”标记标出冲突的地方,你可以与他人协商手动修改这一段代码。

如果你想删除仓库中的一个文件,就要先删除本地导出的文件,然后使用cvs remove 文件名, 
cvs commit来删除。事实上,CVS是不会真正删除这些文件的,如果你还想得到这些文件,只需要,
使用cvs co -r 指定删除前的版本导出就可以了。

有时候为了导出CVS仓库中的深层目录或者文件不得不输入很长的路径,这一点很讨厌,你可以导
出CVS仓库中CVSROOT目录下,修改modules文件,定义这个目录或者文件为一个模块,提交修改后就
可以直接使用cvs co 模块名 就可以导出了。

CVS的版本控制功能主要体现在tag上。标记的作用如同是同时记录了做标记时所有文件的版本,需
要的时候可以一次导出这些版本不一的文件,这常常是在项目的开发达到了一定的目标时使用的。
cvs tag 命令的参数只有一个:标记名。例如:
cvs tag RELEASE_1.0_BETA
以后,如果需要这个版本,只需要使用cvs co -r RELEASE_1.0_BETA就可以导出这个版本了。或者
使用cvs diff -r 来生成patch文件和使用cvs log -r 来查看这个版本的日志。

标记的另外一个非常重要的作用是生成分支和合并分支。
通常,我们的项目的开发到某一定的程度时,需要探索某一条开发途径是否有效,这个时候,我们
需要做一个试验,但是这个试验的分支的开发不能影响项目的主开发分支,这样,我们就可以生成
一个分支开发,主开发分支也可以继续进行,两者并不冲突,将来如果证明分支开发有效,还可以把
分支合并到主开发分支中。建立一个CVS分支:
cvs tag -b 分支标记名

建立分支后,并不影响当前我们从CVS仓库中的文件,需要从CVS仓库中重新导出分支BRANCH_VER:
cvs co -r 分支标记名 模块名 

这样,我们可以进行分支开发,主分支的开发也可以照常进行,如果此分支开发成功,我们可以把它
与主分支合并:
cvs update -j 分支标记名
cvs commit
就可以把开发分支合并到主分支中去了。

以上是本地CVS仓库的操作,如果使用网络CVS仓库,只需要使用CVS_RSH环境变量指定通信shell,另外
设置CVS仓库为网络仓库就可以了。网络上的CVS仓库的服务器有两种:ext和dserver。对于后者在进行
CVS操作时,需要先login验证用户。后者使用rlogin验证,不需要显式登陆。如:

ext CVS 服务器使用
export CVSROOT=:ext:kerberos@power:/home/repository 
或者cvs -d :ext:kerberos@power:/home/repository
cvs co platoon

derser CVS 服务器使用
export CVSROOT=:pserver:anonymous@anoncvs.kde.org:/home/kde
cvs login 
cvs co kdebase

其他一些常用的cvs 命令选项
-d 指定CVS仓库的路径
-zn 使用gzip 压缩后传输,到本地后自动解压。n为压缩级别通常式 1~4,通常使用于服务器的传输速
度较慢的情况下。
-x 用于服务器的通信使用加密算法,只有在使用kerberos验证体系下有效

CVS 的GUI工具
几个常用的GUI工具:
LinCVS(图1),是Xwindow 的CVS客户端工具,比较流行的一个,功能也很强大. 


图1 LinCVS
Cervisia (图2),一个基于KDE的CVS GUI工具,使用KDE的读者使用起来很容易上手. 


图 2 cervisia 
注:文章中的环境变量的设置是在bash下,其他shell使用不同的命令
分享到:
评论

相关推荐

    CVS服务器 项目开发管理

    总结来说,CVS是项目开发管理的重要工具,它提供了一种有效的方式跟踪代码变更,管理多人协作,并确保代码的同步和一致性。尽管现在有许多更现代的版本控制系统(如Git),但CVS在某些场景下仍然是一个实用的选择,...

    CVS项目版本控制工具

    3. **分支与合并**:CVS支持创建代码分支,允许开发人员在不影响主分支的情况下进行实验性开发。一旦开发完成,可以将这些更改合并回主分支。 4. **提交与更新**:开发人员可以通过`cvs commit`命令提交他们的改动...

    myeclipse用cvs上导入项目

    ### 使用MyEclipse通过CVS导入项目的操作...综上所述,通过MyEclipse使用CVS导入项目是一项重要的技能,它不仅能提高工作效率,还能有效管理项目版本。希望本文提供的步骤和建议能够帮助开发者们更好地掌握这一技能。

    很好用的CVS工具,方便在开发中进行版本管理

    **CVS(Concurrent Versions System)**是一种广泛使用的版本控制系统,它允许开发团队协同工作,对源代码和其他项目文件进行版本管理和控制。标题和描述提到的"很好用的CVS工具"指的是CVS系统在软件开发中的应用,...

    用cvs作开源开发

    《使用CVS进行开源开发》第三版是由Karl Fogel撰写的一本详细介绍如何利用CVS进行开源项目开发的书籍。本书深入探讨了CVS在开源项目中的具体应用方式,以及它如何帮助开发者们更高效地合作完成项目。 - **版本控制...

    好用的项目开发管理软件Tortoise CVS

    TortoiseCVS是一款强大的项目开发管理软件,尤其在版本控制方面表现卓越。它作为CVS(Concurrent Versions System)的图形用户界面,为开发者提供了一种直观且易用的方式来管理和跟踪项目源代码的变更。在本文中,...

    cvs开发人员工具

    4. **分支管理**:CVS支持创建分支,允许开发者在不影响主线开发的情况下进行实验性改动。 5. **权限控制**:通过设定访问权限,CVS可以控制谁可以查看、编辑和提交代码。 6. **日志记录**:系统记录每一次的提交...

    Eclipse中导入CVS中的项目

    #### 步骤二:准备导入CVS项目 接下来,在Eclipse的主界面中,找到“包资源管理器”(Project Explorer),通常位于左侧的边栏中。这个面板展示了当前工作空间中所有的项目。在此面板上执行右键点击,会出现一个...

    CVS建立项目

    通过以上六个步骤,可以快速地在本地建立一个CVS项目,并将其纳入版本控制管理。这种方式不仅提高了团队成员之间的协作效率,还保证了项目的稳定性和可靠性。在实际操作过程中,还需要根据具体的开发环境和需求进行...

    CVS版本管理器

    CVS(Concurrent Versions System)是一种广泛使用的源代码版本控制系统,它允许开发者对软件项目的源代码进行版本管理和协同开发。CVS版本管理器在过去的开发环境中扮演着重要角色,尽管它相对较老,但因其简洁易用...

    软件配置管理工具cvs_new

    强大的可塑性:不论是一个源代码组成的项目开发管理,还是代码量超过几百兆的项目,均管理自如。 触发器及定制功能:这种功能帮助开发者将CVS和变动/跟踪系统紧密强大的分布式开发支持:CVS一直以支持分布式开发...

    CVS管理权限,设置开发人员的不同权限

    通过对CVS权限管理的理解和实践,可以有效地控制开发团队成员对项目资源的访问级别,提高项目的安全性。具体来说,包括添加用户、设置密码、绑定真实系统用户以及设置特定用户的读写权限等步骤。此外,还可以通过...

    项目管理小工具cvs及简明教程

    CVS(Concurrent Versions System)是一种源代码版本控制系统,广泛应用于软件开发项目中,它可以帮助团队协作管理项目文档和代码,确保每个团队成员都能访问到最新的、正确的资源。对于小型项目而言,CVS是一个高效...

    CVS管理及代码显示

    在“CVS管理及代码显示”的主题下,我们将深入探讨CVS如何与asp.net项目结合,以及如何管理和显示代码。 CVS系统的核心功能包括版本追踪、代码合并、冲突解决和历史记录查看。它允许开发人员在不同的时间点保存代码...

    CVS使用及管理文档

    - **非构建工具**:虽然CVS对项目文件结构进行保存和恢复,但它本身并不提供构建管理功能。 #### 二、CVS的搭建 本节详细介绍CVS服务器的搭建流程,主要是在Windows环境下使用cvsnt进行部署。 1. **cvsnt的安装**...

    CVS用户管理工具

    CVS(Concurrent Versions System)是一种广泛使用的源代码版本控制系统,尤其在软件开发领域中,它帮助团队协作管理和跟踪代码的变化。在这个“CVS用户管理工具”中,我们将深入探讨如何进行用户管理,包括添加、...

    cvs安装与配置管理

    #### 六、创建CVS项目 1. **导入项目** 在源代码所在目录下执行以下命令: ```bash cvs import -m "This is First Project" First_Project Version_1 start ``` #### 七、客户端用户登录测试 1. **登录测试...

    Myeclipse+下配置CVS服务器源代码管理

    首先,CVS是一种开放源代码的版本控制系统,它允许开发者对项目进行历史追踪,同时支持多人协作开发。MyEclipse作为流行的Java集成开发环境(IDE),集成了CVS功能,使得开发者可以在内部直接进行CVS操作,无需离开...

    CVS配置管理 从入门到精通

    《CVS配置管理 从入门到精通》是针对软件开发团队协作中不可或缺的版本控制工具——CVS(Concurrent Versions System)的详细教程。CVS作为一个C/S架构的系统,其核心功能在于协助多用户对同一份代码或文档进行协同...

Global site tag (gtag.js) - Google Analytics