javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)">老馬寫(xiě)著(zhù) '我整理的這篇文章大部分內容是我在Red Hat Linux 8.0和9.0上驗證過(guò)的,希望對你有幫助。
我整理的這篇文章大部分內容是我在Red Hat Linux 8.0和9.0上驗證過(guò)的,希望對你有幫助。服務(wù)器的安裝略過(guò)不提,因為安裝了開(kāi)發(fā)工具的話(huà)默認就已經(jīng)有了CVS。就算沒(méi)有,更新軟件包就可以搞定,除非你一定要安裝最新版本。1. 首先創(chuàng )建用于CVS的組和用戶(hù): #groupadd cvs #useradd cvsroot -g cvs #passwd cvsroot
OK,用戶(hù)已經(jīng)建立好了,cvsroot就是我們做CVS操作使用的。 2. 修改配置文件: #more /etc/services | grep cvspserver
看看是否有: cvspserver 2401/tcp #CVS client/server operations cvspserver 2401/udp #CVS client/server operations
這2行。系統自帶了CVS時(shí),這2行也已經(jīng)有了,只需要確認一下。如果沒(méi)有,請自己加上去。然后必須創(chuàng )建啟動(dòng)腳本: #vi /etc/xinet.d/cvspserver
內容如下: service cvspserver { disable = no flags = REUSE socket_type = stream wait = no user = root server = /usr/bin/cvs server_args = -f --allow-root=/home/cvsroot pserver log_on_success += USERID log_on_failure += USERID }
其中server指定CVS可執行文件路徑,默認安裝就是/usr/bin/cvs。server_args指定源代碼庫路徑及認證方式等,例子中把源代碼存放在cvsroot的主目錄中,也可以另外指定路徑,但必須注意權限設置,pserver是密碼認證方式,這種方式的安全性要差一些,但操作起來(lái)比較簡(jiǎn)單。請注意每行等號左右都有一個(gè)空格,否則無(wú)法啟動(dòng)服務(wù)。 3. 初始化CVS 切換到cvsroot用戶(hù),然后進(jìn)行初始化: #cvs -d /home/cvsroot init
這個(gè)路徑應該與cvspserver文件中指定的路徑相同,初始化后會(huì )在此路徑下面創(chuàng )建CVSROOT目錄,存放用于CVS管理的一些文件。此時(shí)重新啟動(dòng)xinetd服務(wù),CVS服務(wù)器應該能夠啟動(dòng)了。: #service xinetd restart
當然,重新啟動(dòng)計算機也可以。確認是否啟動(dòng): #netstat -l | grep cvspserver
如果能看到: tcp 0 0 *::cvspserver *::* LISTEN
說(shuō)明已經(jīng)正常啟動(dòng),沒(méi)有的話(huà)請重新檢查配置過(guò)程是否有錯誤或者遺漏。最后還必須檢查防火墻的設置,把2401端口打開(kāi)。 4. 用戶(hù)管理 CVS默認使用系統用戶(hù)登錄,為了系統安全性的考慮也可以使用獨立的用戶(hù)管理。CVS用戶(hù)名和密碼保存在CVSROOT目錄下的passwd文件中,格式為: 用戶(hù)名::密碼::系統用戶(hù)
也就是說(shuō),它把CVS用戶(hù)映射到系統用戶(hù),這樣我們就可以通過(guò)系統用戶(hù)的權限設置來(lái)分配給用戶(hù)不同的權限,而不需要讓用戶(hù)知道系統用戶(hù)名和密碼。passwd文件默認并不存在,我們必須自己創(chuàng )建。文件中的密碼字段使用MD5加密,不幸的是CVS沒(méi)有提供添加用戶(hù)名的命令,所以我們借用Apache的命令來(lái)完成這項工作: #htpasswd passwd username
這個(gè)命令為username指定密碼,并保存在passwd中,文件不存在時(shí)會(huì )自動(dòng)創(chuàng )建。htpasswd命令不是為CVS而設,因此總有一些遺憾,它不能自動(dòng)添加映射到的用戶(hù)名,不過(guò)沒(méi)關(guān)系,我們設置好密碼后,自己把這部分加上。我的做法是映射到cvsroot用戶(hù),如果需要映射其他的用戶(hù),請注意給相應的目錄設置好權限,否則CVS用戶(hù)可能無(wú)法訪(fǎng)問(wèn)源代碼倉庫。要徹底防止使用系統帳號登陸,可以編輯CVSROOT目錄下的config文件,把: #SystemAuth=no
這一行前面的#去掉,CVS就不會(huì )驗證系統用戶(hù)了,否則當用戶(hù)名不在passwd文件中時(shí),CVS會(huì )進(jìn)行系統用戶(hù)的驗證。此外還必須配置讀寫(xiě)權限,使用CVSROOT目錄下的readers和writers文件進(jìn)行這個(gè)工作。這2個(gè)文件默認也是沒(méi)有的,沒(méi)關(guān)系,自己創(chuàng )建就可以了。readers文件記錄擁有只讀權限的用戶(hù)名,每行一個(gè)用戶(hù);writers文件記錄擁有讀寫(xiě)權限的用戶(hù)名,也是每行一個(gè)用戶(hù)。注意,readers文件比writers優(yōu)先,也就是說(shuō)出現在readers中的用戶(hù)將會(huì )是只讀的,不管writers文件中是否存在該用戶(hù)。配置完畢,先測試一下: #cvs -d “::pserver::username@127.0.0.1::/home/cvsroot” login
這里假設用戶(hù)名是username,本機登陸。出現密碼提示,輸入正確的密碼后,登陸成功。如果提示訪(fǎng)問(wèn)被拒絕,請檢查用戶(hù)權限、目錄權限以及防火墻設置。建議設置環(huán)境變量CVSROOT: #export CVSROOT=::pserver::username@127.0.0.1::/home/cvsroot
以后就不需要輸入-d參數了,但-d參數會(huì )覆蓋這個(gè)環(huán)境變量的設置。 5. 源代碼倉庫的備份和移動(dòng) 基本上,CVS的源代碼倉庫沒(méi)有什么特別之處,完全可以用文件備份的方式進(jìn)行備份。需要注意的只是,應該確認備份的過(guò)程中沒(méi)有用戶(hù)提交修改,具體的做法可以是停止CVS服務(wù)器或者使用鎖等等;謴蜁r(shí)只需要把這些文件按原來(lái)的目錄結構存放好,因為CVS的每一個(gè)模塊都是單獨的一個(gè)目錄,與其他模塊和目錄沒(méi)有任何瓜葛,相當方便。甚至只需要在倉庫中刪除一個(gè)目錄或者文件,便可以刪除該模塊的一些內容,不過(guò)并不建議這么做,使用CVS的刪除功能將會(huì )有一個(gè)歷史記錄,而對倉庫的直接刪除不留任何痕跡,這對項目管理是不利的。移動(dòng)倉庫與備份相似,只需要把該模塊的目錄移動(dòng)到新的路徑,便可以使用了。如果不幸在備份之后有過(guò)一些修改并且執行了提交,當服務(wù)器出現問(wèn)題需要恢復源代碼倉庫時(shí),開(kāi)發(fā)者提交新的修改就會(huì )出現版本不一致的錯誤。此時(shí)只需要把CVS相關(guān)的目錄和文件刪除,即可把新的修改提交。 6. 更進(jìn)一步的管理 CVSROOT目錄下還有很多其他功能,其中最重要的就是modules文件。這個(gè)文件定義了源代碼庫的模塊,下面是一個(gè)例子: Linux Linux Kernel Linux/kernel
這個(gè)文件的內容按行排列,每一行定義一個(gè)模塊,首先是模塊名,然后是模塊路徑,這是相對于CVS根目錄的路徑。它定義了兩個(gè)模塊,第一個(gè)是Linux模塊,它位于Linux目錄中,第二個(gè)是Kernel模塊,這是Linux模塊的子模塊。modules文件并非必須的,它的作用相當于一個(gè)索引,部分CVS客戶(hù)端軟件通過(guò)它可以快速找到相應的模塊,比如WinCVS。 7. 協(xié)同開(kāi)發(fā)的問(wèn)題 默認方式下,CVS允許多個(gè)用戶(hù)編輯同一個(gè)文件,這對一個(gè)協(xié)作良好的團隊來(lái)說(shuō)不會(huì )有什么問(wèn)題,因為多個(gè)開(kāi)發(fā)者同時(shí)修改同一個(gè)文件的同一部分是不正常的,這在項目管理中就應該避免,出現這種情況說(shuō)明項目組內部沒(méi)有統一意見(jiàn)。而多個(gè)開(kāi)發(fā)者修改文件的不同部分,CVS可以很好的管理。如果覺(jué)得這種方式難以控制,CVS也提供了解決辦法,可以使用cvs admin-l進(jìn)行鎖定,這樣一個(gè)開(kāi)發(fā)者正在做修改時(shí)CVS就不會(huì )允許其他用戶(hù)checkout。這里順便說(shuō)明一下文件格式的問(wèn)題,對于文本格式,CVS可以進(jìn)行歷史記錄比較、版本合并等工作,而二進(jìn)制文件不支持這個(gè)操作,比如word文檔、圖片等就應該以二進(jìn)制方式提交。對于二進(jìn)制方式,由于無(wú)法進(jìn)行合并,在無(wú)法保證只有一個(gè)用戶(hù)修改文件的情況下,建議使用加鎖方式進(jìn)行修改。必須注意的是,修改完畢記得解鎖。從1.6版本開(kāi)始,CVS引入了監視的概念,這個(gè)功能可以讓用戶(hù)隨時(shí)了解當前誰(shuí)在修改文件,并且CVS可以自動(dòng)發(fā)送郵件給每一個(gè)監視的用戶(hù)告知最新的更新。 8. 建立多個(gè)源代碼倉庫 如果需要管理多個(gè)開(kāi)發(fā)組,而這些開(kāi)發(fā)組之間不能互相訪(fǎng)問(wèn),可以有2個(gè)辦法:: a.共用一個(gè)端口,需要修改cvspserver文件,給server_args指定多個(gè)源代碼路徑,即多個(gè)—allow-root參數。由于xinetd的server_args長(cháng)度有限制,可以在cvspserver文件中把服務(wù)器的設置重定向到另外一個(gè)文件,如: server = /home/cvsroot/cvs.run
然后創(chuàng )建/home/cvsroot/cvs.run文件,該文件必須可執行,內容格式為: #!/bin/bash /usr/bin/cvs -f --allow-root=/home/cvsroot/src1 --allow-root=/home/cvsroot/src2 pserver
注意此時(shí)源代碼倉庫不再是/home/cvsroot,進(jìn)行初始化的時(shí)候要分別對這兩個(gè)倉庫路徑進(jìn)行初始化,而不再對/home/cvsroot路徑進(jìn)行初始化。 b. 采用不同的端口提供服務(wù) 重復第2步和第3步,為不同的源代碼倉庫創(chuàng )建不同服務(wù)名的啟動(dòng)腳本,并為這些服務(wù)名指定不同的端口,初始化時(shí)也必須分別進(jìn)行初始化。 ' |