ubuntu下subversion配置

剛剛成立新的公司,需要建立公司的配置庫,建立版本管理工具是必要的,自己通過在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 文件中:

01 <Location /svn>
02     DAV svn
03     # Alternatively, use SVNParentPath if you have multiple repositories
04     # under a single directory
05     SVNParentPath /home/svn/repos
06     AuthType Basic
07     AuthName "Subversion repository"
08  
09     # 指定基本用戶驗證的密碼文件路徑
10     AuthUserFile /etc/subversion/dav_svn.passwd
11  
12     # 指定文件倉庫訪問的授權配置文件路徑
13     <IfModule mod_authz_svn.c>
14         AuthzSVNAccessFile /etc/subversion/dav_svn.authz
15     </IfModule>
16  
17     #<LimitExcept GET PROPFIND OPTIONS REPORT>
18         Require valid-user
19     #</LimitExcept>
20  </Location>

重啓 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 的內容如下:

01 [groups]
02 design=user1,user2,user3
03 test=user4,user5
04  
05 [project1:/]
06 admin=rw
07 @design=rw
08 @test=r
09  
10 [project2:/]
11 admin=rw
12 @design=rw
13 @tester=r

如果在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:// 的方式訪問到上面配置的兩個文件倉庫了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章