歡迎您光臨本站 註冊首頁

CVS 速成班

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  何偉平

結合文檔和一些網上資源,折騰了半天終於搞定了CVS,我寫一點非常簡單的"速成"的教材.希望對大家有用.

下面是我的步驟和做法.

1,要求:

root 許可權;
CVS軟體,請找到相關的rpm,tgz,deb 等包裝上,或者到

http://www.cvshome.org/CVS/Dev/code
下載原程序編譯安裝,這裡我不準備介紹它的安裝,請參考CVS自身的文檔安裝.
我使用Slackware的tgz包,安裝的命令是
#installpkg cvs*.tgz
其他包請參考對應包管理工具的命令.
一定的系統資源,要有一定內存(32M就能工作得很好),要一定的磁碟空間,看你的項目的大小和多少而定.
2,架設CVS伺服器:
建立CVSROOT目錄,因為這裡涉及到用戶對CVSROOT里的文件讀寫的許可權問題,所以比較簡單的方法是建立一個組,然後再建立一個屬於該組的帳戶,而且以後有讀寫許可權的用戶都要屬於該組.假設我們建一個組cvs,用戶名cvsroot.建組和用戶的命令如下
#groupadd cvs
#adduser cvsroot
生成的用戶家目錄在/home/cvsroot(根據自己的系統調整)
用cvsroot用戶登陸,修改 /home/cvsroot (CVSROOT)的許可權,賦與同組人有讀寫的許可權:
$chmod 771 . (或者770應該也可以)
注意:這一部分工作是按照文檔說明做的,是否一定需要這樣沒有試驗,我會在做試驗后在以後版本的教程說得仔細一點.如果您有這方面的經驗請提供給我,謝謝.


建立CVS倉庫,(仍然是cvsroot用戶),用下面命令:
$cvs -d /home/cvsroot init
以root身份登陸,修改/etc/inetd.conf 和 /etc/services,分別加入下面一行:
在 /etc/inetd.conf 里加入:
cvsserver stream tcp nowait root /usr/bin/cvs cvs --allow-root=/home/cvsroot pserver
說明:上面的行是單獨一整行,/usr/bin/cvs 應該是你的cvs版本的命令路徑,請根據自己的系統調整./home/cvsroot 是你建立的CVSROOT的路徑,也請根據上面建立目錄的部分的內容做調整.

在/etc/services里加入:
cvsserver 2401/tcp

說明:cvsserver是任意的名稱,但是不能和已有的服務重名,也要和上面修改/etc/inetd.conf那行的第一項一致.這裡我用的是CVS的口令認證方式,CVS還有其他認證方式,我沒有做試驗,如果您有經驗,請補充,謝謝.


添加可以使用CVS服務的用戶到cvs組:
以root身份修改/etc/group,把需要使用CVS的用戶名加到cvs組裡,比如我想讓用戶laser和gumpwu能夠使用CVS服務,那麼修改以後的/etc/group應該有下面這樣一行:
cvs:x:105:laser,gumpwu
在你的系統上GID可能不是105,沒有關係.主要是要把laser和gumpwu用逗號分隔開寫在最後一個冒號後面.當然,象RedHat等分發版有類似linuxconf這樣的工具的話,用工具做這件事會更簡單些.
重起inetd使修改生效:
#killall -HUP inetd
這樣伺服器就設置完成了.我們接著搞客戶端.
3,設置客戶端,如果是Linux(或者其他*nix),客戶端和伺服器端的軟體是一樣的,如果是Win,MAC等平台,請到http://www.loria.fr/cgi-bin/molli/wilma.cgi/rel 找相應的客戶端軟體,這裡我先說一下在Linux(*nix)里怎麼做:

設置環境變數CVSROOT:
$export CVSROOT=:pserver:laser@the_server_name:/home/cvsroot
注意:這裡的pserver是訪問方式,我在上面設置的是口令認證,所以這裡是pserver,如果你的CVS伺服器設置成別的訪問模式,那麼需要相應修改.laser是可以使用 CVS伺服器的用戶名,這裡可以根據你的設置修改,我在這個版本設置的是直接使用系統用戶的口令文件,也就是說laser必須是CVS伺服器上的合法用戶,這裡當然有安全問題,CVS可以設置成為擁有自己的用戶,我將在以後的版本裡面增加這些內容,或者您也可以提供一些補充,或者直接讀CVS的文檔.the_server_name是CVS伺服器的名稱或者IP地址,根據你的情況填寫,/home/cvsroot是你的CVS伺服器的CVSROOT目錄,根據你的CVS伺服器設置做修改或者詢問管理員.你可以把這行放到你的shell的profile里(.bash_profile,.profile等)這樣就不用每次敲一長串命令了.


登陸CVS伺服器:
$cvs login,這時候cvs會問你口令,請把你在CVS伺服器上的口令敲進去,這裡是laser在CVS伺服器上的系統用戶的口令:
Passwd:xxxxxxxx
成功登陸后將在你的家目錄建立一個.cvspass文件,以後就不用輸入口令了.好,客戶端設置完成,簡單吧.
現在伺服器和客戶端都設置好了,那麼怎麼用呢,我在這裡寫一個最簡單的(估計也是最常用的)命令介紹:
首先,建立一個新的CVS項目,一般我們都已經有一些項目文件了,這樣我們可以用下面步驟生成一個新的CVS項目:

進入到你的已有項目的目錄,比如叫cvstest:
$cd cvstest
運行命令:
$cvs import -m "this is a cvstest project" cvstest v_0_0_1 start
說明:import 是cvs的命令之一,表示向cvs倉庫輸入項目文件. -m參數後面的字串是描述文本,隨便寫些有意義的東西,如果不加 -m 參數,那麼cvs會自動運行一個編輯器(一般是vi,但是可以通過修改環境變數
EDITOR來改成你喜歡用的編輯器.)讓你輸入信息, cvstest 是項目名稱(實際上是倉庫名,在CVS伺服器上會存儲在以這個名字命名的倉庫里.)
v_0_0_1是這個分支的總標記.沒啥用(或曰不常用.)
start 是每次 import 標識文件的輸入層次的標記,沒啥用.這樣我們就建立了一個CVS倉庫了,然後,我們可以把這個測試項目的文件刪除.試驗一下如何從倉庫獲取文件.這裡我假設上面的所有客戶端工作你都已經做過了.
運行下面的命令:
$cvs checkout cvstest
從倉庫中檢索出cvstest項目的源文件.
如果你已經做過一次checkout了,那麼不需要重新checkout,只需要進入cvstest項目的目錄,更新一把就行了:
$cd cvstest
$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:表明你曾經修改國該文件,但是偏偏有個不識相的也修改了這個文件,而且還提交給倉庫了!

如果你只是想保持軟體的同步的話(象我),那麼上面的東西就足夠用了.可是如果多人協作開發項目的話,可就不是了這麼簡單了.當你參加項目,維護文件時,就需要更多命令,比如說你我都是某nasdaq項目的開發人員:

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這個文件更新為最新版本,然後再幹活.然後提交.

如果這天你修改了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


好了,上面所有的東西,估計就是我們用cvs時80%情況下用的命令和內容,包括文件的更新,提
交,衝突的解決,分支的派生,增刪文件等.實際上cvs的功能之強大,遠遠超出我在這裡描述的
內容,我這個"速成"也就管不了太多了,希望隨著時間的推移,我們能夠更加有效地使用CVS.
也希望大家能夠不斷補充這篇文章,最後能夠成為手冊,而不僅僅是速成.當然,還要更多地參考
別的文檔.

參考資料:
http://www.loria.fr/cgi-bin/molli/wilma.cgi/doc.865331095.html
http://www.loria.fr/~molli/cvs/doc/cvs_toc.html


[火星人 ] CVS 速成班已經有277次圍觀

http://coctec.com/docs/program/show-post-72402.html