CVS 是目前最常用的版本控制和軟件配置系統。其開源性在其普及的過程中功不可沒,然而正因爲開源造成了其易用性較差。往往一個功能需要通過幾個看似不相干的操 作配合才能進行。Windows下CVS的多帳戶配置正是這樣一個相當重要的,但很不好操作的功能。幾個難點如下:
- CVS源自Unix系統,其Windows的移植版並沒有服務器功能。在Windows下一般採用安裝CVSNT這個軟件來建立CVS Repository,但CVSNT的操作方法和原始的CVS略微不同。
- CVS本身是命令行形式,其配置過程比較繁雜。
- CVS的多帳戶配置需要手動修改Repository的CVSROOT文件夾裏的文件,缺乏統一的界面。
在 安裝了CVSNT服務器之後,默認的用戶就是建立Repository的Windows系統的登陸帳戶,但在多人開發的時候,肯定沒人希望大家都使用同一 個名字來Commit;更重要的是,我們可能需要配置開發人員的權限,例如限制某些人只能看程序,而某些人可以Commit程序,某些人可以添加新的 Module。以下是詳細的步驟,環境是CVSNT 2.5.03 (Build 2151) + TortoiseCVS 1.8.25:
1. 使用CVSNT建立一個Repository。假設初始使用Windows的管理員administrator密碼登陸,Repository使用 Pserver協議,IP是1.2.3.4,端口號是2401,Repository名稱是/TestRep,密碼是123。這時的 administrator也是此Repository的管理員。
2. 爲了進行多用戶配置,必須修改Repository的CVSROOT目錄的幾個文件。首先在客戶端 將:pserver:[email protected]/TestRep設爲CVSROOT環境變量(請注意區分CVSROOT目錄和 CVSROOT環境變量)。然後用administrator登陸到CVS,最後Check Out出此CVSROOT目錄。命令如下所示:
cvs login
//輸入密碼123
cvs co CVSROOT
3. 在服務器端爲Windows添加一個專門用於CVS操作的Windows帳戶。所有的CVS帳戶都要映射到這個Windows帳戶上進行實際的操作。雖然 很多資料並沒有提到需要建立Windows帳戶,但我在實驗中發現沒有這種帳戶,CVS在後邊執行任何操作時都會報告沒有此帳戶的錯誤。假如這個新的帳戶 叫做cvsuser。使用Windows命令
net user cvsuser cvsuserpassword /Add
可 以添加此帳戶。在添加完成之後,一定要記得將/TestRep在服務器上的實際文件夾的權限裏添加cvsuser的讀寫權限,否則到最後任何映射到 cvsuser的CVS帳戶都會因爲沒有寫權限無法進行正常的commit操作。首先在服務器上的資源管理器裏的“工具”菜單裏找到“文件夾選項”,在隨 後出現的“查看”選項卡里找到“使用簡單文件夾共享”的項目,取消掉前面的勾,單擊確定。然後右擊/TestRep所在文件夾,單擊“屬性”。在隨後打開 的對話框裏可以看到“安全”選項卡。我們需要在這裏添加cvsuser的讀寫權限。
4. 爲CVS添加自己的帳戶。通過使用命令cvs passwd我們可以添加任意多個CVS帳戶(當然,只是針對當前的Repository)。所有的帳戶信息會被保存在CVSROOT目錄的passwd 文件當中。然而這個文件是不能Check Out出來的,只能在服務器那裏看到它,並且其保存的密碼信息是被加過密的。我們可以添加cvsadmin,user1,user2,anonymous 等用戶。例如添加cvsadmin時的命令是:
cvs passwd -a -r cvsuser cvsadmin
//輸入cvsadmin的密碼
//再次輸入cvsadmin的密碼
這 樣就新添了cvsadmin帳戶,並將其映射到Windows帳戶cvsuser上(-a表示添加一個賬戶,-r表示影射到操作系統的帳戶中。我期望將 cvsadmin作爲以後/TestRep的管理員。這一點十分重要,如果這時候不設置的話,再將CVS改爲“僅使用CVS帳戶校驗模式”之後就再也沒有 機會添加管理員了(因爲只有管理員可以看得到和操作CVSROOT目錄)。
5.設定 cvsadmin爲CVS管理員。在客戶端的CVSROOT目錄下新添一個名爲admin的文件。在裏面將每一個想要升爲管理員的CVS帳戶的帳戶名寫到 文件中,每行一個帳戶名。當然admin文件只有放到服務器,cvsadmin的升遷才能生效。但是,僅僅是這麼將admin文件提交上去是不能起作用 的。在提交它之前,必須將admin的信息添加到checkoutlist文件中。checkoutlist的格式在文件中有介紹,是“空格 文件名 空格 出錯信息 回車符”。我們在裏面添加一條記錄:
admin adminerror
特別注意admin前面一定要留一個空格。
6. 當新的CVS管理員和帳戶信息都準備好後,就要將/TestRep的帳戶校驗模式從“操作系統集成校驗模式”修改爲“僅使用CVS帳戶校驗”模式。這麼做 可以避免爲了在CVS中使用多用戶時需要操作Windows帳戶的麻煩。這個設置的地方在CVSROOT目錄中的config文件。打開客戶端的 config文件,將裏面的#SystemAuth=yes改爲SystemAuth=no(注意將#刪除後,SystemAuth前不能有空格)。修改 後保存config文件。
7.提交CVSROOT裏的所有更新到服務器,我們的設置就生效了。命令如下所示:
cd CVSROOT
cvs add -m "" admin
cvs commit -m ""
不 過在提交之前,你也許想先把CVSROOT的owner從原來的administrator修改爲cvsadmin。使用命令cvs chown可以做到這一點。在提交了CVSROOT目錄後,校驗模式就立刻改變了,cvsadmin也同時開始生效。這時,用之前的 administrator就無法使用CVS了。我們改用cvsadmin帳戶重新登陸,繼續下面的操作。
8. 修改讀寫權限。CVS有兩種讀寫權限的設置方法,一是粗粒度的,一是細粒度的。只有CVS管理員才能進行訪問權限的修改。粗粒度的方法是在CVSROOT 中添加readers或者writers文件來實現。在readers裏添加的任何一個帳戶對當前庫只擁有讀取權限,添加格式是每行一個帳戶名。例如,我 們在客戶端的CVSROOT目錄裏添加readers文件,將之前的一個新建帳戶anonymous放到裏面,然後commit這個readers文件到 服務器。anonymous就不能進行commit了。實際的測試結果是在使用anonymous登陸之後執行commit指令,系統會報告正常執行完 畢。但實際上,沒有任何東西被commit,暴露了CVS在人機界面上的不完善。writers文件的操作readers完全一樣。如果一個帳戶名被同時 寫到兩個文件裏,此帳戶只有只讀權限。細粒度的方法是使用chacl命令。例如/TestRep裏有3個工程,project1、project2、 project3。使用命令:
cvs chacl -u user1 -a none -d project1,project2,project3
cvs chacl -u user1 -a all -d project1
cvs chacl -u user1 -a read,write -d project2
cvs chacl -u user1 -a read -d project3
可以讓user1擁有對project1目錄的完全控制權,對project2目錄的讀寫權,和對project3目錄的只讀權。第一條命令首先刪除user1的所有權限,在隨後的3條命令裏分別設置了3個不同目錄權限。
9.使用帳戶組來組織帳戶。在客戶端的CVSROOT目錄下添加一個叫group的文件。此文件的格式是:
組名1:用戶名1,用戶名2,用戶名3,……
組名2:用戶名5,用戶名7,……
……
修改完group文件後commit它,然後通過chacl命令可以實現組權限的修改。