這里重要的是 Status 欄,這里總共可能有四種狀態(tài):
Up-to-date:表明你要到的文件是新的.
Locally Modified:表明你曾經(jīng)修改過(guò)該文件,但還沒(méi)有提交,你的版本比倉(cāng)庫(kù)里的新.
Needing Patch:表明有個(gè)哥們已經(jīng)修改過(guò)該文件并且已經(jīng)提交了!你的版本比倉(cāng)庫(kù)里的舊.
Needs Merge:表明你曾經(jīng)修改國(guó)該文件,但是偏偏有個(gè)不識(shí)相的也修改了這個(gè)文件,而且還提交
給倉(cāng)庫(kù)了!
如果你只是想保持軟件的同步的話(象我),那么上面的東西足夠用了.可是如果多人協(xié)作開(kāi)發(fā)
項(xiàng)目的話,可不是了這么簡(jiǎn)單了.當(dāng)你參加項(xiàng)目,維護(hù)文件時(shí),需要更多命令,比如說(shuō)你我都
是某nasdaq項(xiàng)目的開(kāi)發(fā)人員:
1,你對(duì)某個(gè)文件做了修改,比如說(shuō)改了ceo.c,加了一行程序:printf("where can I find VC to cheat!");
改完之后你要把修改提交給倉(cāng)庫(kù),用命令:
$cvs commit -m "add a complain" ceo.c
或者是:
$cvs commit -m "worry about money"
讓cvs幫你檢查哪個(gè)文件需要提交.
2,當(dāng)我開(kāi)始干活的時(shí)候,可能我先:
$cvs status
一把,這時(shí)候我會(huì)看到:
===============================================
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這個(gè)文件更新為新版本,然后再干活.然后提交.
如果這天你修改了coo.c,加了一行 puts("how about another kind of bragging?");
并且提交了,但是這時(shí)候我已經(jīng) $cvs status 過(guò)了,是說(shuō)我不知道你的修改.
而我加了一行printf("You must shamelessly and seems knowingness to act as a coo");
并且傻乎乎地提交:
$cvs commit coo.c
這時(shí)候,CVS會(huì)告訴我
cvs commit: Examing .
cvs server: Up-to-date check failed for 'coo.c'
cvs [server aborted]: correct above error first!
于是我知道有個(gè)狗屎在我修改文件的當(dāng)口做了提交,于是我
$cvs update
這時(shí)cvs會(huì)報(bào)告:
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,這時(shí)一般文件里看起來(lái)象這樣:
...
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
于是下回你再更新的時(shí)候有新的補(bǔ)釘要打...如此往復(fù),直到完成所有修改.
不過(guò)這里有一些要注意的地方是刪除程序,如果你刪掉一行對(duì)你可能沒(méi)有用的程序
puts("to be honest"); 而我不想刪除(因?yàn)槲矣杏茫也恢榈刂苯樱骸?br />
$cvs update
了,那么我的這行程序也完蛋了,所以這里我們要注意所有開(kāi)發(fā)人員的協(xié)調(diào),千萬(wàn)不要
亂刪東西,大不了用
#if 0
#endif
宏定義對(duì)括起來(lái).實(shí)在要?jiǎng)h東西,那好先標(biāo)記一個(gè)版本:
$cvs tag v_0_0_1
然后你可以發(fā)布并刪除你自己的工作目錄里這個(gè)版本的文件(注意:不是刪除倉(cāng)庫(kù)里的.):
$cvs release -d nasdaq
然后你再生成一個(gè)新分支:
$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
編輯并修改這個(gè)分支的文件,這樣的做法比較好.
還有一些命令,比如要增加一個(gè)文件 garbage_china_concept_stocks_list:
$cvs add garbage_china_concept_stocks_list
然后還要:
$cvs commit garbage_china_concert_stocks_list
看起來(lái)有點(diǎn)象數(shù)據(jù)庫(kù)里的事務(wù)?的確是這樣.CVS維護(hù)著一個(gè)本地的參考文件(在CVS/Entries里),
這樣提交的時(shí)候可以一次地把所有改變放到服務(wù)器端,這樣也更安全.
同樣,如果想刪除文件 bankrupted_web_site:
$rm bankrupted_web_site
$cvs remove bankrupted_web_site
$cvs commit bankrupted_web_site
好了,上面所有的東西,估計(jì)是我們用cvs時(shí)80%情況下用的命令和內(nèi)容,包括文件的更新,提
交,沖突的解決,分支的派生,增刪文件等.實(shí)際上cvs的功能之強(qiáng)大,遠(yuǎn)遠(yuǎn)超出我在這里描述的
內(nèi)容,我這個(gè)"速成"也管不了太多了,希望隨著時(shí)間的推移,我們能夠更加有效地使用CVS.
也希望大家能夠不斷補(bǔ)充這篇文章,后能夠成為手冊(cè),而不僅僅是速成.當(dāng)然,還要更多地參考
別的文檔.
參考資料:
http://www.loria.fr/cgi-bin/molli/wilma.cgi/doc.865331095.html
http://www.loria.fr/~molli/cvs/doc/cvs_toc.html