1
、简介
CVS
是
Concurrent Version System(
并行版本系统
)
的缩写,用于版本管理
.
如果大家曾经参与过多人协作开发的项目,大家肯定有这样的痛苦经历:由于多个人同时修改同一个文件,
自己辛辛苦苦修改的程序被别人彻底删除了
.
另外,如果你的软件
/
程序已经发布了三个版本,
而这时候用户需要你修改第二个版本的东西,也许你会因为只保留了最新版本而痛哭流涕。还有就是你对程序做了一些修改,但是修改很少,你只想给远方的同事发一个两个版本之间的差别文件,这样可以免于邮箱不够大,网速太慢之类的问题
.
为了解决类似这样的问题,以及诸如生成补丁文件,历史版本修改等,一帮黑客
(
褒义
)
在原先
Unix
体系里很成熟的
SCCS
和
RCS
的基础上,开发了
CVS
。
(SCCS
:
Source Code Control System
,
RCS
:
Revision Control System)
。
CVS
的基本工作思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序
.
这样,就好象只有一个人在修改文件一样
.
避免了冲突
.
每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行,然后用
cvs
命令进行提交,由
cvs
仓库管理员统一
修改
.
这样就可以做到跟踪文件变化,冲突控制等等
.
由于
CVS
是典型的
C/S
结构的软件,因此它也分成服务器端和客户端两部分。不过大多数
CVS
软件都把它们合二为一了。我们这里就分别从服务器和客户端的角度讨论
cvs
的使用。
2、第一次工作
从
cvs
数据库提出项目代码,例如,提出项目
8501
的源文件,执行如下命令:
$cvs
checkout
8501
在用户的主目录中会自动创建一个
8501
目录,
8501
的所有源文件即被提出到了其中。
3、第二次工作
记住,从此以后,需要提取项目源文件就不需要再重新
checkout
了,只需要进入项目的目录,更新一下就行了:例如需要再次提出
8501
的所有源代码,进入到用户自己的主目录下的
8501
目录中,
$cd
8501
执行命令
$cvs
update
一下即可.又或者不想直接更新,只是想看看有没有更新的东西,那么:
$cvs
status
这时后会打印出一长串状态报告(你可能需要用类似
less
这样的命令分页显示,或者定向到一个输出文件里慢慢看.),对项目中的每个文件有一份状态报告,类似这样:
===================================================================
File:
foo.c
Status:
Up-to-date
Working
revision:
1.1.1 .1
'Some
Date'
Repository
revision:
1.2
/home/cvsroot/cvstest/foo.c,v
Sticky
Tag:
(none)
Sticky
Date:
(none)
Sticky
Options:
(none)
这里最重要的就是
Status
栏,这里总共可能有四种状态:
Up-to-date
:表明你要到的文件是最新的.
Locally
Modified
:表明你曾经修改过该文件,但还没有提交,你的版本比仓库里的新.
Needing
Patch
:表明有人已经修改过该文件并且已经提交了!你的版本比仓库里的旧.
Needs
Merge
:表明你曾经修改过该文件,但是另外也有人也修改了这个文件,而且还提交给仓库了!
4
、提交你的工作
你对某个文件做了修改,比如说改了
ceo.c
,加了一行程序:
printf("where
can
I
find
VC
to
cheat!");
改完之后你要把修改提交给仓库,用命令:
$cvs
commit
-m
"add
a
complain"
ceo.c
或者就是:
$cvs
commit
-m
"worry
about
money"
让
cvs
帮你检查哪个文件需要提交.
5
、增加文件或者目录
假如要增加一个文件,例如:
garbage_china_concept_stocks_list
:
执行命令
$cvs
add
garbage_china_concept_stocks_list
然后还要:
$cvs
commit
garbage_china_concert_stocks_list
看起来有点象数据库里的事务?的确是这样.
CVS
维护着一个本地的参考文件(在
CVS/Entries
里),这样提交的时候就可以一次地把所有改变放到服务器端,这样也更安全。
6
、删除文件或者目录
假如想删除一个文件,例如:
bankrupted_web_site
:
执行命令
$rm
bankrupted_web_site
$cvs
remove
bankrupted_web_site
$cvs
commit
bankrupted_web_site
7
、解决协同项目工作中的冲突
如果只是想保持软件的同步的话,那么上面的命令就足够用了.可是如果多人协作开发项目的话,可就不是了这么简单了.当你参加项目,维护文件时,就需要更多命令,比如说你我都是
8501
项目的开发人员:
1
,你对某个文件做了修改,比如说改了
ceo.c
,加了一行程序:
printf("where
can
I
find
VC
to
cheat!");
改完之后你要把修改提交给仓库,用命令:
$cvs
commit
-m
"add
a
complain"
ceo.c
或者就是:
$cvs
commit
-m
"worry
about
money"
让
cvs
帮你检查哪个文件需要提交.
2
,当我每次开始工作的时候,会先执行一下
$cvs
status
这时候我会看到:
==================================================================
File:
ceo.c
Status:
Needing
Patch
Working
revision:
1.1.1 .1
'Some
Date'
Repository
revision:
1.2
/home/cvsroot/nastaq/ceo.c,v
Sticky
Tag:
(none)
Sticky
Date:
(none)
Sticky
Options:
(none)
于是我知道你改了
ceo.c
,于是就:
$cvs
update
ceo.c
或者干脆:
$cvs
update
把
ceo.c
这个文件更新为最新版本,然后再工作.然后提交�o
cvs
数据库.
如果这天有人修改了
coo.c
,加了一行
puts("how
about
another
kind
of
bragging?");
并且提交了,但是这时候你已经
$cvs
status
过了,就是说你不知道其他人的修改.
而你加了一行
printf("You
must
shamelessly
and
seems
knowingness
to
act
as
a
coo");
并且提交了:
$cvs
commit
coo.c
这时候,
CVS
会告诉你
cvs
commit:
Examing
.
cvs
server:
Up-to-date
check
failed
for
'coo.c'
cvs
[server
aborted]:
correct
above
error
first!
于是你可以知道有人在你修改文件的当口做了提交,于是你可以执行
$cvs
update
这时
cvs
会报告:
RCS
file:
/home/cvsroot/nasdaq/coo.c,v
retrieving
revision
1.1.1.1
retrieving
revision
1.2
Merging
differences
between
1.1.1.1
and
1.2
into
coo.c
rcsmerge:
warning:
conflicts
during
merge
cvs
update:
conflicts
found
in
coo.c
C
coo.c
告诉你
coo.c
有版本冲突,于是你可以编辑
coo.c
,这时一般文件里看起来象这样:
...
printf("You
must
shamelessly
and
seems
knowingness
to
act
as
a
coo");
<<<<<<<
foo.c
=======
...
puts("how
about
another
kind
of
bragging?");
>>>>>>>
1.2
...
于是你把上面改成:
printf("You
must
shamelessly
and
seems
knowingness
to
act
as
a
coo");
puts("how
about
another
kind
of
bragging?");
然后
$cvs
commit
-m
"merged"
coo.c
于是下回你再更新的时候就有新的补钉要打...如此往复,直到完成所有修改.
不过这里有一些要注意的地方就是删除程序,如果你删掉一行对你可能没有用的程序
puts("to
be
honest");
而我不想删除(因为我有用),而我不知情地直接:
$cvs
update
了,那么我的这行程序也完蛋了,所以这里我们要注意所有开发人员的协调,千万不要
乱删东西,大不了用
#if
0
#endif
宏定义对括起来.实在要删东西,那最好先标记一个版本:
$cvs
tag
v_0_0_1
8
、发布版本
然后你可以发布并删除你自己的工作目录里这个版本的文件(注意:不是删除仓库里的.):
$cvs
release
-d
nasdaq
9
、形成分支
然后你再生成一个新分支:
$cvs
rtag
-b
-r
v_0_0_1
v_0_0_1_1
nasdaq
然后再建立
v_0_0_1_1
的分支
$cvs
checkout
-r
v_0_0_1_1
nasdaq
编辑并修改这个分支的文件,这样的做法比较好.