1、安裝必要軟體包
SVN最常用的方式是通過Apache2使用(其他方式本文不會涉及,最主要是我也沒做過.^_^),因此需要安裝apache2。在一般情況下,我的伺服器上會安裝php,因為我選擇了apache的apache2-mpm-prefork包。安裝命令:
shell#apt-get install apache2-mpm-prefork libapache2-svn subversion
Debian的包管理系統會自動安裝缺少的包。
2、配置
svn作為apache2的一個模組,設定檔在Debian下位於/etc/apache2/mods-available/dav_svn.conf(其他發行版或許有所區別)。首先我們看一個設定檔樣本:
<Location /svn>
DAV svn
SVNParentPath /data/svn_repos/
AuthzSVNAccessFile /etc/apache2/erya.authz
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
</Location>
說明:
a)第一行:<Location /svn>表示svn倉庫位於/svn虛擬目錄下面(Location的作用有點類似Alias的作用)。當然你可以的目錄,比如<Location /src>。那麼這樣配置一般您將可以通過瀏覽器http://hostname/svn進行瀏覽(如果許可權足夠的話)。
b)第二行: DAV svn表示dav啟用svn支援。如果您想更詳細瞭解dav是啥去baidu或者google一下,網上資料蠻多的。
c)第三行:SVNParentPath /data/svn_repos表示使用SVNParent方式,並且倉庫的實體路徑為/data/svn_repos.SVN支援兩種對項目的管理方式,一種是SVNParent,另一種是SVN(?)。我一般更喜歡SVNParent這種方式,因為使用這種方式添加一個新項目是不需要重啟 apache的,而另一種方式則需要。對於一個實際使用的伺服器來說,是否需要常常重啟是一件很重要的事情了。這兒的/data/svn_repos目錄必須是存在而且目錄的屬主應該為apache的使用者(Debian下一般為www-data)。mkdir
-p /data/svn_repos;chown -R www-data:www-data /data/svn_repos。注意:設定檔預設的是SVNPath,即使用的後一種方式。
d)第四行:AuthzSVNAccessFile /etc/apache2/erya.authz。表示使用者權限檔案是/etc/apache2/erya.authz(許可權檔案的寫法我在後面再說)。檔案可以位於任意其他位置。
e)第五至八行:經常配置apache的朋友,我想一定看出來了,這個是apache的配置,使用使用apache的使用者檔案作為身分識別驗證,需且要求有效使用者才可以訪問。如果您使用其他使用者管理方式,比如pam,LDAP或者MySQL等都是一樣的。其實在設定檔注釋中已經說明了怎麼樣使用 htpasswd進行使用者管理的方式。在此需要注意的是第四行的配置與此處的配置,在authz許可權檔案中,只配置哪個使用者是什麼樣的許可權,而判斷是否已經通過密碼驗證卻是由apache的使用者管理實現的。也就是說,比如我有一個使用者qsg,那麼判斷這個使用者的密碼是否正確是由此處完成的,而判斷此使用者對哪些項目有什麼樣的許可權則是由authz檔案完成的。
上面這個配置樣本是最簡單的一個配置,其實您還可以通過這個配置xlst檔案,以改變通過瀏覽器查看的效果(我嘗試過幾次,不過配置出來的效果比預設更難看,所以索性作罷。)
配置完成後,進入/etc/apache2/mods_enabled查看指向dav_svn.conf和dav_svn.load的檔案連結是否存在(apache據此啟動模組)。
3、建立使用者檔案
在dav_svn.conf的注釋中已經說明了建立使用者檔案的方法:
htpasswd2 -c /etc/apache2/dav_svn.passwd jsz
添加使用者jsz到/etc/apache2/dav_svn.passwd檔案中,如果檔案不存在,則建立。
4、建立項目倉庫
我們假設您的配置的SVNParentPath目錄是/data/svn_repos。進入/data/svn_repos,此時目錄應該是空的。
建立一個項目倉庫分為三個步驟:a)建立目錄b)使用svnadmin初始化新項目目錄c)將目錄屬主改為apache的使用者(本文中我們都假設您使用預設為www-data使用者)。
我寫了一個小指令碼(假設檔案名稱為createnew):
#!/bin/bash
echo "Create a new resposity ..."
mkdir $1
svnadmin create $1
chown -R www-data:www-data $1
很簡單,三條命令。用法:./createnew test,則我們就建立了一個test項目。建立其他項目也一樣,比如:./createnew project1
執行完以後再查看一下目錄情況下。我們可以進入test目錄看看,它不象CVS一樣,你能夠看到什麼,因為svn使用了Berkeley資料庫來存放代碼.
5、建議許可權檔案(authz)
svn授權粒度可以是單獨使用者,也可以是使用者組。
svn的許可權分為三種:無許可權,讀許可權,讀寫權限。無許可權當然是禁止訪問,讀許可權也就是說有瀏覽許可權,你可以checkout代碼,但不能提交。讀寫權限當然是最大許可權了,讀寫添加刪除都可以。
svn的授權深度是它最大的特點了,它不僅可以對整個項目授權,甚至於它可以對項目下的某個目錄,某個檔案進行單獨授權。我認為這是非常有用的一個功能。
咱們還是先來看一個檔案樣本吧:
[groups]
manager = jsz
user = user1,user2
[test:/]
@manager = rw
[test:/file1]
@manager = rw
user1 =
user2 = rw
先來解釋一下吧:
a)groups區段,就如它的名字所說的那樣,是定義使用者組用的。比如在樣本檔案中定義了兩個組maanger組和user組。
b)項目區段,每一個區段是一個授權單位。比如樣本中有兩個項目區段test:/和test:/file1。對於test:/表示對test項目的根目錄授權,test:/file1表示對test項目下的/file1檔案授權(目錄也是一樣)。如果我們還需要對test項目的dir1目錄進行授權,則我們需要再增加一個test:/dir1區段。
c)授權。如果要對某個項目的某部分進行項目組授權,則寫法為組名前加@符號(如@manager),如果要對單獨使用者授權,則直接為使用者名稱。等號(=)後面是許可權,有三種寫法:空(無許可權),r(讀許可權),rw(讀寫權限)。預設為空白,即無許可權。
d)許可權優先順序。您可能已經看到了我在test:/區段對user1授了讀許可權,而對user2是無許可權,而對於/file1下的檔案,我給user1授了無許可權,給user2授了讀寫權限。這個就是許可權的優先順序問題,即目錄越深,許可權越是優先。比如test下有一目錄 /dir1/dir2/dir3/dir4/file5,那麼對於使用者user1來說,svn首先檢查是否有針對user1的對file5的授權,若有,則用此授權;如果沒有,再判斷user1對dir4的許可權,至到/目錄。如果至根目錄依然沒有設定,則使用預設許可權(無許可權)。
6、重啟apache
該寫的設定檔都寫了,那我們就重啟一下apache服務吧。/etc/init.d/apache2 restart
然後通過瀏覽器查看一下吧:http://hostname/svn/test
現在因為我們還沒有往svn是添加任何東西,所以我們看到的是"Revision 0: /"
7、svn的簡單※作
svn※作除了命令列以後,在windows和linux的圖形化介面下,都有相應的用戶端軟體。
a)匯入
初始化以後,庫中沒有任何東西,所以我們首先要將我們的內容import進去。
作為一個示範:
mkdir /tmp/svn
cd /tmp/svn
touch file1
svn import http://hostname/svn/test -m "init" #會提示你輸入使用者名稱和口令,使用者預設為目前使用者,如果不正確,直接斷行符號再輸入使用者名稱
現在通過瀏覽器查看http://hostname/svn/test,我們可以看到現在已經變成"Revision 1: /"而且我們可以看到file1檔案也存在了。
b)Checkout
checkout的※作是將代碼從svn伺服器上取下來。
繼續上面的示範:
cd ..
rm -rf svn
svn co http://hostname/svn/test #我們看到在tmp目錄下多了一個test目錄。
C)Add和Commit
cd test
vi file1 #修改一下file1檔案
touch file2 #新增一個file2檔案
svn stat #查看一下目前的目錄的檔案改動情況
我們看到file2前面是一個問號,表示file2還沒有加到倉庫中。file1前面是一個M,表示修改。
svn add file2 #添加file2,add與import的區別是add並不會直接加到svn伺服器上,而import則會。add只是增加了一個添加作業項。
svn ci -m "add file2 and modify file1" #提交
現在通過瀏覽器查看http://hostname/svn/test,我們可以看到現在已經變成"Revision 2: /"而且我們可以看到file2檔案也存在了。
8、常見問題
a)配置後通過瀏覽器提示許可權禁止
將/etc/apache2/mods-available/dav_svn.conf中的<LimitExcept GET PROPFIND OPTIONS REPORT>行和</LimitExcept>注釋掉。本文僅是一個基本配置,如果您想瞭解這兩行的含義可以通過網路搜尋一下吧。
最後,如果將subversion結合viewvc使用,那麼基於web的版本瀏覽,就更完美了,推薦一個windows下的用戶端給大家吧,使用TortoiseSVN,有中文包的,使用非常方便。