/*这个操作我根据网络文章简单配置了一下,没有所有的操作都验证。*/
以下操作在客户端目录cvstest以cvs用户进行。
1.设置环境变量CVSROOT:
$export CVSROOT=:pserver:laser@the_server_name:/home/cvsroot
你可以把这行放到你的shell的profile里(.bash_profile,.profile等),
这样就不用每次敲一长串命令了.
2.登录CVS服务器:
$cvs login,这时候cvs会问你口令,请把你在CVS服务器上的口令敲进去。成功登陆后将在你的家目录建立一个.cvspass文件,以后就不用输入口令了.好,客户端设置完成,简单吧.
3.Import操作
进入到你的已有项目的目录,比如叫cvstest:
$cd cvstest
运行命令:
$cvs import -m "this is a cvstest project" cvsroot v_0_0_1 start
说明:import 是cvs的命令之一,表示向cvs仓库输入项目文件.
-m参数后面的字串是描述文本,随便写些有意义的东西,如果不加-m参数,那么cvs会自动运行一个编辑器(一般是vi,但是可以通过修改环境变量EDITOR来改成你喜欢用的编辑器.)让你输入信息,
cvsroot 是项目名称(实际上是仓库名,在CVS服务器上会存储在以这个名字命名的仓库里.)
v_0_0_1是这个分支的总标记.没啥用(或曰不常用.)
start 是每次 import 标识文件的输入层次的标记,没啥用.
这样我们就建立了一个CVS仓库了。将cvstest目录中的所有文件import到cvsroot目录中。
4.Checkout操作
$cvs checkout cvsroot
从cvsroot仓库中检索出项目的源文件.
如果你已经做过一次checkout了,那么不需要重新checkout,只需要更新一把就行了:
$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:表明你曾经修改过该文件,但是偏偏有个不识相的也修改了这个文件,而且还提交给仓库了!
5.Commit操作
你对某个文件做了修改,比如说改了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帮你检查哪个文件需要提交.
6.工作之前版本检查
当我开始干活的时候,可能我先:
$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这个文件更新为最新版本,然后再干活.然后提交.
7.版本冲突管理(代码增加)
如果这天你修改了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
然后你可以发布并删除你自己的工作目录里这个版本的文件(注意:不是删除仓库里的.):
$cvs release -d nasdaq
然后你再生成一个新分支:
$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
编辑并修改这个分支的文件,这样的做法比较好.
还有一些命令,比如要增加一个文件 garbage_china_concept_stocks_list:
$cvs add garbage_china_concept_stocks_list
然后还要:
$cvs commit garbage_china_concert_stocks_list
看起来有点象数据库里的事务?的确是这样.CVS维护着一个本地的参考文件(在CVS/Entries里),
这样提交的时候就可以一次地把所有改变放到服务器端,这样也更安全.
同样,如果想删除文件 bankrupted_web_site:
$rm bankrupted_web_site
$cvs remove bankrupted_web_site
$cvs commit bankrupted_web_site