剛剛成立新的公司,需要建立公司的配置庫,建立版本管理工具是必要的,自己通過在ubuntu中國上面一點一點學習,積攢了安裝Subversion的如下經驗:
ubuntu version:12.04
本文涉及的範圍
要通過 HTTP 協議訪問 Subversion 文件倉庫,需要安裝並配置好 Web 服務器。Apache2 被證實可以很好的與 Subversion 一起工作。關於 Apache2 的安裝超出了本文的範圍(假設已經安裝好Apache2) ,儘管如此,本文還是會涉及如何配置 Apache2 使用 Subversion。
類似的,要通過 HTTPS 協議訪問 Subversion 文件倉庫,您需要在您的 Apache2 中安裝並配置好數字證書,這也不在本文的討論範圍之中。
安裝 Subversion
Subversion 已經包含在 main 倉庫中。所以,要安裝 Subversion,您只需要簡單的運行:
1 |
$
sudo apt-get install subversion |
2 |
$
sudo apt-get install libapache2-svn |
服務器配置
通過上面的命令已經安裝了所需的軟件包。接下來將闡述如何創建 Subversion 倉庫以及如何設置項目的訪問權限。
創建 Subversion 倉庫(Respository)
許多位置都可以放置 Subversion 倉庫,其中兩個最常用的是:/usr/local/svn 以及 /home/svn。我們選擇把 Subversion 倉庫放在 /home/svn/repos,並且假設我們需要建立兩個倉庫 project1 和 project2。
通常的情況下,首先創建一個名爲 “Subversion” 的用戶組,該組是 Subversion 倉庫所在的目錄的擁有者。
使用如下命令增加組,並且把用戶加到組裏:
1 |
$
sudo addgroup subversion |
2 |
$
sudo usermod -G subversion -a www-data//將www-data用戶加入到subversion組 |
www-data 是專門爲 web server 運行而創建的用戶,系統中已經預先創建好了。
查看上面兩個命令的執行結果:
1 |
$
cat /etc/group | grep subversion |
2 |
subversion:x: 1001 :www-data |
執行如下命令創建倉庫目錄,我這裏創建兩個項目:
1 |
$
sudo mkdir -p /home/svn/proj1 |
2 |
$
sudo mkdir -p /home/svn/proj2 |
下面命令用於創建 Subversion 倉庫:
1 |
$
sudo svnadmin create /home/svn/project1 |
2 |
$
sudo svnadmin create /home/svn/project2 |
設置倉庫的用戶和組:
1 |
$
sudo chown -R www-data:subversion /home/svn/proj1 |
2 |
$
sudo chown -R www-data:subversion /home/svn/proj2 |
訪問方式
Subversion 倉庫可以通過多種不同的方式進行訪問——通過本地硬盤,或者通過各種網絡協議。無論如何,文件倉庫的位置總是使用 URL 來表示。
下面是幾種不同的 URL 模式及其對應的訪問方法:
- file:/// —— 直接訪問本地硬盤上文件倉庫
- http:// —— 通過 WebDAV 協議訪問支持 Subversion 的 Apache2 Web 服務器
- https:// —— 類似 http://,支持 SSL 加密
- svn:// —— 通過自帶協議訪問 svnserve 服務器
- svn+ssh:// —— 類似 svn://,支持通過 SSH 通道
通過 WebDAV 協議訪問(http://)
WebDAV (Web-based Distributed Authoring and Versioning) 一種基於 HTTP 1.1協議的通信協議.它擴展了HTTP 1.1,在GET、POST、HEAD等幾個HTTP標準方法以外添加了一些新的方法,使應用程序可直接對Web Server直接讀寫,並支持寫文件鎖定(Locking)及解鎖(Unlock),還可以支持文件的版本控制。
Apache mod_dav_svn 配置
要通過 WebDAV 協議訪問 SVN 文件倉庫,首先必須配置 Apache 2 Web 服務器。加入下面的代碼片段到 /etc/apache2/mods-available/dav_svn.conf 文件中:
03 |
#
Alternatively, use SVNParentPath if you
have multiple repositories |
04 |
#
under a single directory |
05 |
SVNParentPath
/home/svn/repos |
07 |
AuthName "Subversion
repository" |
10 |
AuthUserFile
/etc/subversion/dav_svn.passwd |
13 |
<IfModule
mod_authz_svn.c> |
14 |
AuthzSVNAccessFile
/etc/subversion/dav_svn.authz |
17 |
#<LimitExcept
GET PROPFIND OPTIONS REPORT> |
重啓 Apache2 Web 服務器
1 |
$
sudo service apache2 restart |
密碼文件 dav_svn.passwd 的創建
1 |
$
sudo htpasswd -c /etc/subversion/dav_svn.passwd user_name |
它會提示你輸入密碼,當您輸入了密碼,該用戶就建立了。“-c” 選項表示創建新的 /etc/subversion/dav_svn.passwd 文件,所以 user_name 所指的用戶將是文件中唯一的用戶。如果要添加其他用戶,則去掉“-c”選項即可:
1 |
$
sudo htpasswd /etc/subversion/dav_svn.passwd other_user_name |
授權配置文件dav_svn.authz
首先需要加載mod_authz_svn.so
在目錄 /etc/apache2/mods-enabled 下創建軟鏈接到 ../mods-available/authz_svn.load
1 |
$
cd /etc/apache2/mods-enabled |
2 |
$
sudo ln -s ../mods-available/authz_svn.load |
../mods-available/authz_svn.load文件的內容爲:
1 |
LoadModule
authz_svn_module /usr/lib/apache2/modules/mod_authz_svn.so |
這裏我指定了三個組: design 組 和 test 組,design 組讀寫權限,test組只有讀的權限。另外,設置一個管理員賬號 admin,管理員對所有項目有讀寫權限。
授權文件 /etc/subversion/dav_svn.authz 的內容如下:
02 |
design=user1,user2,user3 |
如果在Check in的時候遇到如下錯誤:
1 |
Can’t
open ‘/home/svn/myproject/db/txn-current-lock’: Permission denied |
這是因爲文件所屬的用戶和組不對造成的問題,可以重新對整個項目目錄設置用戶和組:
1 |
$
sudo chown -R www-data:subversion /home/svn/proj1 |
如果你不想將項目目錄的擁有者設置成 www-data 的話,比如你可能想設置爲 root:
1 |
$
sudo chown -R root:subversion /home/svn/proj1 |
必須將 root 加入 subversion 組:
1 |
$
sudo usermod -G subversion -a root |
還要設置組的屬性:
1 |
$
sudo chmod -R g+rws /home/svn/proj1 |
然後查看 txn-current-lock 文件的權限和用戶以及組信息,應該類似於:
1 |
$
ls -l /home/svn/myproject/db/txn-current-lock |
2 |
-rw-rwSr-- 1 root
subversion 0 2009 - 06 - 18 15 : 33 txn-current-lock |
使用svn客戶端工具的配置
如果你不需要使用WebDAV方式訪問,可以不配置以上的步驟。
建立好svn倉庫以後,每個倉庫下應該包含以下文件
我們主要配置"conf"下的配置文件,包含三個
authz 用於配置權限信息
passwd 用於配置用戶以及其密碼
svnserve.conf 配置校驗模式 用戶以及權限文件的路徑
上面我們建立了兩個項目的版本庫,把passwd、authz文件複製一份到/home/svn目錄中,以便統一配置,使這兩個項目都是用這兩個文件,不使用自己目錄下的配置文件,但是svnserve.conf使用各自的。
首先,打開svnserve.conf
(1)修改2個版本庫的svnserve.conf文件
把授權權限打開:
anon-access = none
auth-access = write
在proj1版本庫中修改svnserve.conf:
password-db = ../../passwd
authz-db = ../../authz
proj2版本庫中修改svnserve.conf:
password-db = ../../passwd
authz-db = ../../authz
(2)修改根目錄中的passwd文件,也就是剛剛拷貝到svn根目錄下的
在passwd文件中創建用戶和密碼:
[users]
qianxin = qx
yiyu = yy
gongyu = gy
zhaoming = zm
dai = dai
yinjun = yj
wangying = wy
一共創建了7個用戶
(3)修改根目錄中的authz文件
在authz中設置權限:
[groups] #分組
prj1_group = dai,gongyu,wangying
prj2_sh_group = zhaoming,yinjun
prj2_xa_group = qianxin,yiyu
[/] #根目錄,即所有的版本庫(包括prj1、prj2),這裏的目錄以/home/svn爲根目錄
qianxin = rw #管理員
[proj1:/] #prj1項目
qianxin = rw #由於指定了"* = r",覆蓋了父目錄權限的繼承,因此需要另外指定管理員對該版本庫的訪問權限
@prj1_group = rw #組權限,前面必須加@
* = r #除了prj1_group組以外所有人的權限
[proj2/shanghai:/] #prj2中的shanghai項目
qianxin = rw #同上
@prj2_sh_group = rw
* = #除了prj2_sh_group組以外所有人都無法訪問該版本庫
[proj2/xian:/] #prj2中的xian項目
prj2_xa_group = rw
注意點:
子目錄繼承父目錄的訪問權限,如果指定了管理員對根目錄具有讀寫權限,則管理員對子目錄也具有讀寫權限。
但是,如果在子目錄中設置* = 來割斷對父目錄權限的繼承,則子目錄中必須設置管理員權限爲rw,下面這種設置是有問題的:
[arm:/]
qianxin = rw
[arm:/diary/shanghai]
dai = rw
gongyu = rw
* =
由於管理員qianxin對/diary/shanghai沒有任何權限,因此就無法進行導入(導入要求對所有目錄都有寫的權限)。正確的做法是在子目錄的權限配置中也加上“qianxin = rw”。
至此,Subversion 服務器的配置已經完成了,藉助 SVN 客戶端軟件就可以通過 svn:// 的方式訪問到上面配置的兩個文件倉庫了。