環境:Ubuntu10.10
目的:可本地或通過Web訪問Subversion。
SVN最常見的配置模式便是與Apache集成,這樣SVN可以采用WebDev協議方式提供服務。主要的好處有:通過Apache以HTTP方式穿透防火牆,便於在互聯網環境使用;提供目錄的版本控制;純2進制的文件對比方式等。
1. 安裝Subversion
apt-get install subversion
apt-get install subversion-tools
2. 安裝Apache
apt-get install apache2
apt-get install libapache2-svn
3. Apache和Subversion的集成
查看/etc/apache2/mods-enabled/dav_svn.load文件,有mod_dav_svn.so和mod_authz_svn.so這兩個動態庫說明apache已經加載了Subversion的訪問控制模塊。如果沒有,手動添加。
編輯/etc/apache2/mods-enabled/dav_svn.conf文件,在最后加入下述內容:
<Location /svn> DAV svn SVNParentPath /home/svn AuthType Basic AuthName "Subversion Repository" AuthUserFile /home/svn/passwd.conf AuthzSVNAccessFile /home/svn/authz.conf Require valid-user </Location>
命令touch /home/svn/passwd.conf和touch /home/svn/authz.conf來創建這2個不存在的文件。
<Location /svn> 意思是Subversion版本可用的URL是http://SubversionServerIP/svn
DAV SVN 告訴Apache是哪個模塊響應哪個URL的請求,在這里是Subversion模塊
SVNParentPath /home/svn 告訴Subversion需要查看的版本庫在/home/svn之下。如果不希望為每個單獨的項目都進行單獨的設置,可以把所有項目都存放在統一的資源庫目錄,使用SVNParentPath指令來指定存放所有項目的路徑。否則使用SVNPath
SVNPath 單版本庫時使用此項指明版本庫的路徑,但在多版本庫中不要使用此項
AuthType Basic 認證類型為基本認證,就是用戶名和密碼
AuthName "Subversion repository" 認證名稱,將在瀏覽器界面彈出一個對話框,標題為Subversion repository
AuthUserFile /home/svn/passwd.conf 指定使用的認證密碼文件,即訪問版本庫用戶的文件,用apache的htpasswd命令生成
AuthzSVNAccessFile /home/svn/authz.conf 設定訪問版本庫權限的文件
Require valid-user 要求驗證用戶,即不能匿名訪問。如果沒有該語句,則只能第一個用戶可以訪問新建庫
此外,SVNIndexXSLT “/svnindex.xsl” 使用它可以在用瀏覽器時更好看
4. 在添加了上述內容后,必須重啟Apache2 HTTP服務器
/etc/init.d/apache2 restart
5. Subversion建立版本庫
mkdir /home/svn mkdir /home/svn/repos svnadmin create --fs-type fsfs /home/svn/repos
運行創建版本庫的命令,指定數據存儲為 FSFS,如果要指定為 Berkeley DB,則將 fsfs 替換為 bdb。
如果一切正常,命令執行后沒有任何反饋信息而迅速返回。一個新的版本庫就被創建出來。我們可以查看下版本庫里有什么。
其中,conf 目錄下存放了版本庫的配置文件,包括用戶訪問控制和權限控制等內容;dav 目錄是提供給 Apache 相關模塊的目錄,目前為空;db 目錄下存放着 Subversion 所要管理的所有受版本控制的數據,不同的存儲方式(Berkeley DB 或者 FSFS)下有着不同的目錄結構,不過我們一般不用直接修改和查看這個目錄下的內容,Subversion 的命令可以安全的操作這個目錄;另外,hooks 目錄存放着鈎子腳本及其模版(一種版本庫事件觸發程序),locks 目錄存放着 Subversion 版本庫鎖定數據,用來追蹤存取文件庫的客戶端;format 文件是一個文本文件,里面只放了一個整數,表示當前文件庫配置的版本號。
注意:庫與庫之間不能包含。
我們可以測試下Subversion能不能檢出。
6. Subversion添加項目
管理員必須考慮的問題是,將每一個項目分別放在不同的版本庫里面,還是將它們放在統一的版本庫里面。統一的版本庫可以讓管理員更加容易的升級和備份,不過,由於訪問權限控制是針對整個版本庫的,所以,統一的版本庫也為不同項目配置不同的訪問權限帶來了麻煩。所以,管理員應該根據實際情況權衡考慮。
我以統一的版本庫為例,添加三個項目business,develop和project。首先在一個臨時目錄下,根據 Subversion 版本控制的一般布局結構,創建出三個項目的主要目錄樹,如下:
然后用 svn import 命令導入已有的目錄樹。
svn import /home/svn/tmp/ file:///home/svn/repos/ --message "init"
可以用 svn list 確認導入的項目是否正確:
svn list --verbose file:///home/svn/repos/
如果要查看最新修訂版本的信息,可以使用 svnlook info 命令:
svnlook info /home/svn/repos/
還可以在命令后面接上 “--revision 版本號” 來指定某一個修訂版的顯示。
還可以用如下命令來顯示版本庫的具體樹形結構,后面的 “--show-ids” 選項指定顯示每一個顯示元素的修改版本 ID。
svnlook tree /home/svn/repos/ --show-ids
7. Subversion添加用戶
添加第一個用戶,要加參數-c。以后不用加。
htpasswd -c /home/svn/passwd.conf user1
Subversion追加用戶:
htpasswd /home/svn/passwd.conf user2
passwd.conf文件的生成內容是用戶名加上密碼的 MD5 密文。
8. Subversion分配用戶權限
新添加的用戶是不能訪問Subversion的,還要為他分配權限。編輯/home/svn/authz.conf文件,例:
[groups] vip = wang admin = wangqixuan, yang develop-manager = zhong business-manager = shi developer = ma, hu, zhou, cen, huang [repos:/] @admin = rw * = r [repos:/develop/01-Windows項目組/01-ARM架構] @vip =rw @admin = rw @develop-manager = rw * = [repos:/develop/01-Windows項目組/02-X86架構] @vip =rw @admin = rw @develop-manager = rw zhou = rw hu =rw ma = r * =
[repos:/develop/02-Linux項目組/01-ARM架構] @vip =rw @admin = rw @develop-manager = rw cen = r huang = r * = [repos:/develop/02-Linux項目組/02-X86架構] @vip =rw @admin = rw @develop-manager = rw cen = r huang = r * = [repos:/develop/個人目錄] @vip =rw @admin = rw @develop-manager = rw @developer = rw * =
其中* = 表示其它所有用戶都沒有任何權限。@表示用戶組,*表示所有用戶,[/]表示全部目錄。注意頂格寫。UTF-8格式才能配置SVN權限,Linux下默認是UTF-8,Windows下有轉換工具,比如Eclipse->Edit->最后一項。一般針對最末梢文件設置權限。
特別注意:權限分配時,不能寫成cen, huang =r,這樣提交時會出現錯誤:svn Commit failed checkout of 403 forbidden。應該寫成cen = r和huang = r
9. Subversion啟動
svnserve -d -r /home/svn
Subversion 設計了一個抽象的網絡層,版本庫建立完畢之后,可以通過各種服務器向外公布。svnserve 是 Subversion 自帶的一個小型的服務器,它使用獨立的協議與客戶端。–i 作為 inetd 啟動。-d參數表示svnserve將會作為一個服務程序運行在后台。-r參數表示將/home/svn指定為代碼庫的根目錄。這樣,當客戶端使用類似svn://192.168.0.1/repos這樣的URL訪問服務器的時候,其所訪問的真實庫是/home/svn/repos。另外如 --listen-port,--listen-host 可以指定綁定的地址和端口,-R 可以強制設定為 Read-Only 模式。
下面命令可檢查是否成功啟動:
ps -ef | grep svn
10. SVN客戶端的安裝及簡單使用
TortoiseSVN下載地址:http://tortoisesvn.net/downloads.html
在Win7上新建文件夾作為本地副本的存儲目錄,單擊右鍵,選擇TortoiseSVN->Repo-browser,在彈出框URL中添加Subversion的訪問地址http://ServerIP/svn/repos
Check Out取出服務器上的版本庫到本地。
chown -R www-data:www-data /home/svn/repos
可解決在客戶端提交時出現subversion can't open file “xxx”Permission denied的問題
注:為了以后備份方便,可將passwd.conf和authz.conf兩個文件放在repos/conf下,相應地也改動Apache2配置文件里<Location>字塊所指路徑,重啟Apache2。
【參考資料】
用 Apache 和 Subversion 搭建安全的版本控制環境 https://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/