首先login用
然後進到一個source 的最上層,例如$HOME/myproj裡面,然後用
2.$ cvs import myproj dev_team r_0_0_1
|
就會把所有下面的檔案通通放進CVS管理,其中import是CVS一個命令, myproj是模組module名字,這可以亂取的,不一定要是目錄名,dev_team 是一個廠商標籤(vendor tag),誰放進去的識別名字,r_0_0_1是版本標籤。 這時會跳出vi來叫你輸入對這次import的感想。就是這個模組的log資訊。
這樣原本的$HOME/myproj就沒有用了,必須新從櫃子裡面拿出一個module, 在$HOME下面用
就會拿出櫃子的檔案來,這時新的myproj才是真的有用了,裡面會多一個CVS 的目錄,裡面是client端的admin files 用來做管理的。
從此你要改myproj的程式,通通都在這個目錄下,然後如果你開始更動檔案, 改完了檔案,要用
把你的改變送回櫃子去。file.c不寫就自動是整個source tree. 你可以偷偷看一下遠端櫃子裡面有什麼東西。 可以有很多不同的模組module,也就是專案在櫃子裡面,重複上面用法就好了。
當別人有commit行為時,你要進到這個module目錄上用
來下載新的版本。
其中commit完會叫你輸入一些紀錄訊息,型式是隨意的沒有特定格式。 會去叫vi起來,如下圖
其中
CVS: xxxx.....
CVS: xxxx.....
CVS: xxxxx.....
|
這些行只是提醒你而已,打完就存檔然後這些行就會自動消失,只有你 寫的log資訊會被存起來。
cvs login :簽入CVS
cvs import :放個module進CVS管理
cvs chekcout :拿出一個module
cvs add :增加個檔案
cvs remove :移除檔案
cvs commit :送交改變,每次都要輸入這次的送交資訊,叫log message。
cvs update :別人有新的送交行為時,更新自己的版本,同步櫃子的版本。
cvs status :看目前repository裡面有那些檔,檔案版本等等資訊 -l只看local
cvs diff :看兩個版本的差異
cvs log :看一下log歷史紀錄
cvs logout :簽離CVS
|
增加檔案與刪除檔案除了要用add remove之外,還要有commit的動作。主要 是add remove 只是先讓在Client這邊做個增加刪除的記錄,只有commit 才會完成批次的所有增加與刪除。remove 的動作沒辦法一次remove掉目錄, 與目錄下所有檔案, 而是要一個一個先rm後再cvs remove, 另外也不能將它們從repository清乾淨, 主要原因是舊的版本中,這個目錄是存在的,將來或許還需要check out舊版本, 所以check out 新版本時,將會看到一個空的已經移走的目錄, 如果不想看到這個空目錄,則check out與update要
cvs co -P module_name
cvs update -P
|
另外如果要處理binary檔,例如jpg Micorsoft DOC檔,commit時要加-kb選項,update時加-A這個選項。 請看參考篇的說明。
cvs tag : 為目前檔案建立一個名稱 發行存取等等 都可以用tag來辨認
: 通常是站在top of source給全部的檔
: cvs tag xxxx .
cvs export -r tag-name module
: 建立一個沒有admin files的版本 也就是沒有CVS這些目錄在source下
cvs release : release (cvs checkout 不能再用了)
cvs rdiff : 建立目前版本與指定版本的source patch file
|
在上面的命令中後面都還可以跟著一些選項,例如
-d : 後面跟著repository所在可以動態改變一下repository
-m : 是說check in的log message.
-l : 是說只有目前所在目錄下檔案(local)不會把子目錄的檔案考慮進來
-r : 是存取某個tag的版本(reversion)
-D : 存取某個特定日期版本
|
當有人commit了程式後,大家怎麼會知道呢,所以CVS內可以自動在特殊事件後 ,做些特殊的動作。在server那端,$CVSROOT/CVSROOT下面有一些檔案
CVS管制檔案
- commitinfo
-
這是CVS正式執行commit前的先行檢查程式,定義在這裡面。
- loginfo
-
當有人寫了log message之後就執行裡面定義的命令。通常是commit後 執行。
- editinfo
-
這已經不再用了
- verifymsg
-
檢查commit進來後的log message,可以用個script來檢查。因為 可能一個group裡面對於你的log message有格式的規定,例如一定 要有bug ID,一定要有人名name:的字眼,如果log message不合 團隊的規定,可以把他踢回去。
要修改這些檔案也請先用cvs來存取這些檔案。 其檔案內容格式是
regular-express是emacs裡的基本regular express只要符合這個 regular express的模組名稱都會執行後面的命令。 例如有這行在loginfo
^study mail -s "information" < info.file
|
如果repository裡面有study_computer,study,computer_study這三個模組, 則只有study_computer,study這兩個模組當有人commit 時會去執行mail的動 作。當然也可以用script作為執行命令。
表示說如果沒有模組名符合regular express搜尋,則自動用cvs-log這隻程式。
有些字串是相對於版本有所變化的,例如版本號碼,你可以有3種format字串來 代表他們
%s 檔案名
%V 舊的版本號碼
%v 新的版本號碼
|
如果有兩個以上要一起用,要用{}括起來例如我有下面這行在loginfo內
study mail -s "%{sVv}" nick@debian.comc.com
|
表示只要送交進study這個專案模組的檔案,則會送出這個檔的名字, 舊版本號碼,新版號碼放在mail的subtitle裡面送給nick。
通常我們程式開發時,會有莫名的想法,可能是改進的演算法, 可能是其他的新功能。但是可能不是完全定案,這時我們可以另外 開一支分支來測試我們的新idea程式版本。如圖
原本的就是叫mainline branch
對於每次的release,可能我們要給一個tag來做識別,一個tag可以給 某個特定檔案,也可以給整個專案。將來要存取時也可以用tag來做辨認。
$ cvs tag tag_name . 建立一個tag叫tag_name給所有檔案
$ cvs co -r tag_name module_name 從module_name下取出tag_name的所有檔
$ cvs status -v 看目前檔案的status可以看出有什麼tag
|
用
$ cvs status -vl [files]
$ cvs log -l [files]
|
檢查。 tag還有更有用的作用就是來建立branch,建立branch用 cvs tag -b來為branch建立一個tag。
$ cvs tag -b r-1-0-patches
$ cvs rtag -b -r r-1-0 r-1-0-patches myproj
$ cvs checkout -r r-1-0-patches myproj
$ cvs update -r r-1-0-patches myproj
|
存取branch不管用commit,update...都要用symbol tag名稱了。
其中r-1-0-patches是有名字的tag(symbolic tag)。
tag -b 是說相對於目前local工作目錄下的版本給一個分支
rtag -b 是相對於r-1-0這個版本給一個分支r-1-0-patches
|
checkout -r 也可以checkout -D用日期
當嘗試完branch覺得不錯想要merge進原有的mainline版本, 先用
再用cvs commit建立新版本。 以上面例子言就是把1.2.2.2跟1.2的差異先merge到目前工作目錄, 然後下次用commit時,就會產生新的mainline 版本1.5了。
基本上cvs是架在另一個古早的版本控制叫rcs上的,這裡面有一種機制 是可以lock檔案的,也就是只有你可以編輯別人不能編輯,
就可以了
不過這不是好方法,因為當初cvs設計哲學就是要讓大家同時發展程式, 不過有時你改改我改改,程式送交時會發生衝突(conflict)的狀況, 也就是兩個人同時對同一行code修改,而且送交後這有點像race condition。 這時你必須要確定這段相衝的程式是被允許的,修改完後,才能再送交。 當用cvs update時, 如下
#include
#include
int main(int argc,
char **argv)
{
init_scanner();
parse();
if (argc != 1) {
fprintf(stderr, "tc: No args expected.\n");
exit(1);
}
if (nerr == 0)
gencode();
else
fprintf(stderr, "No code generated.\n");
<<<<<<< driver.c
exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
=======
exit(!!nerr);
>>>>>>> 1.6
}
|
表示在exit(nerr == 0......這一行同時兩個人做了修改, 後來的這個人必需解決conflict的問題才行cvs commit。 減少conflict的狀況可以用watch edit機制,在程式發展時,可以知道 有誰同時在寫某個檔案,這樣就降低conflict的機會。用
這個在自己工作目錄的檔案將被標為read-only,files沒給的話內定為整 個repository。
自己的工作目錄下的檔案將被標為read-write,而且通知所有watch檔案的 人,我要開始改了。
將會把自己放到通知的名單上去,這樣有人用cvs edit就會通知我了。
通知的Administration file是$CVSROOT/CVSROOT/notify notify內的%s是watch user的意思,跟前面loginfo的%s不一樣,所以應該是
study mail %s -s "I am editing" < info.file
|
表示在study這個模組下watch的user會被通知info.file的內容。
发表于 @ 2004年09月12日 14:34:00|评论(loading...)|编辑