Subversion版本控制

Subversion版本控制

一、簡介
二、svnserve
三、SSH+SVN
四、Apache+SVN

一、簡介:
Subversion是一款自由開放的版本控制軟件。Subversion可以管理文件、文件夾以及記錄它們的修改狀況。Subversion常用來幫助我們管理軟件開發的源代碼或是公司手冊文檔。
Subversion通過將文檔導入至版本庫中進行管理,版本庫類似於文件服務器,但比文件服務器更強大的是它可以記錄你每一次對文件或目錄的修改狀況,並提供還原數據至老版本的功能。
版本控制概念圖:

Subversion框架圖:

從圖中可以看出服務端保存着Subversion版本庫,客戶端通過命令或圖形界面連接服務端,並建立本地“工作拷貝”(從服務端將版本庫中的資料拷貝至本地)。
客戶端訪問服務端時可以通過簡單的svnserve訪問、file本地訪問、Apache間接訪問。
1.svnserve是一個小巧、輕便的服務器程序,通過它客戶端可以使用Subversion專有的協議進行訪問,其特點是設置簡單。
2.由於svnserve本身並不提供加密通訊的功能,所以如果你需要更安全的連接,可以使用svnserve+ssh的方式,通過連接SSH服務器建立在SSH隧道,在通過SSH調用svnserve程序。
3.Apache通過mod_dav_svn訪問版本庫,使得客戶可以通過訪問Apache取得版本庫資料進行版本控制。
Subversion服務器對比圖:


二、svnserve示例(本文環境爲CentOS6.2):
    1. 安裝Subversion
    [root@centos6 ~]# yum -y install subversion
    2. 創建版本庫
提示:這裏計算機中提前有一個目錄/shells,裏面存放着公司的通用腳本,公司準備將其版本化。
    [root@centos6 ~]# mkdir /var/svn
    [root@centos6 ~]# svnadmin create /var/svn/project1
    //project1目錄將自動創建,並初始化版本庫,此時版本庫無版本文件
    [root@centos6 ~]# svn import /shells  file:///var/svn/project1 -m "Initial DATA"
    //將shells目錄中的文件導入版本庫,使其版本化。-m後跟說明性字符串,可任意輸入。

提示:這裏file:///var/svn/project1即通過本地訪問版本庫,並導入數據至版本庫。

    此時,版本庫已經創建完成,併成功導入了我們的腳本文件(工作中你可以導入自己的任何文件)。但如果你需要訪問版本庫卻僅可以通過本地file的方式訪問,訪問方法如下:
    [root@centos6 ~]# svn list file:///var/svn/project1/         //列出版本庫中的文件列表
    [root@centos6 ~]# mkdir /test; cd  /test                     //創建本地拷貝目錄
    [root@centos6 ~]# svn checkout file:///var/svn/project1    //將版本庫中的文件拷貝至本機

提示:在本機保存一份本地拷貝後,以後即就當作普通文件對其進行修改,修改完成後隨時可以上傳回版本庫,更新版本庫。

      方法是:svn commit -m "Log"
    這裏我們需要的是客戶可以通過網絡從遠程訪問版本庫,如上所述方法可以有多種,我們先看第一種簡單的svnserve方式。
    3. 啓動svnserve服務的方式
    [root@centos6 ~]# svnserve -d
     //作爲守護進程啓動svnserve服務,默認監聽端口3690,如果有防火牆注意防火牆設置
     svnserve運行後,會將所有的版本庫發佈至網絡(如果有多個版本庫的話)
     客戶端需要指定據對路徑訪問版本庫如svn://centos.example.com/var/svn/project1
    [root@centos6 ~]# svnserve -d -r /var/svn/project1      //限制僅發佈project1一個版本庫至網絡
    客戶端可以使用相對路徑訪問版本庫如svn://centos.example.com/project1
    4. 認證與授權
    當客戶端訪問版本庫時服務器會讀取版本庫中的conf/svnserve.conf中定義的認證與授權策略實現權限控制。
    [root@centos6 ~]# cat /var/svn/project1/conf/svnserve.conf

  1.  ... 
  2. [general] 
  3. anon-access = read            //匿名用戶權限爲只讀,此處可以設置爲none,read,write 
  4. auth-access = write           //經過認證的用戶權限爲可寫 
  5. password-db = passwd          //指定用戶存放用戶名與密碼的文件,該文件位於conf目錄下名爲passwd 
  6. authzauthz-db = authz         //指定基於版本庫路徑的訪問控制(可以對文件或目錄設置權限) 
  7. real = My First Repository    //設置版本庫域,如果兩個版本庫的認證域相同,他們將使用相同的密碼數據 
  8. ... 
  9. 提示:以上設置行默認全部爲註釋行,如果需要可以根據自己的需要去除註釋。 

    下面我們來看看passwd與authz文件格式:
    [root@centos6 ~]# cat /var/svn/project1/conf/passwd

  1.  ... 
  2. [users] 
  3. harry = harryssecret      //用戶名爲harry密碼爲harryssecret 
  4. sally = sallyssecret      //用戶名爲sally密碼爲sallyssecret 
  5. 提示:以上內容默認同樣爲註釋行,如果需要可以去除#註釋,或是添加自己的新用戶與密碼。 

    [root@centos6 ~]# cat /var/svn/project1/conf/authz

  1.  ... 
  2. [groups] 
  3. admins = harry,sally  //定義組,組成員有harry與sally 
  4. [/]                   //對版本庫根路徑設置權限,可以設置爲你需要控制的路徑 
  5. @admins = rw          //admins組中的用戶用戶可讀,可寫權限 
  6. * = r                 //其他所有人只讀,權限可以設置爲只讀('r'),讀寫('rw'),無權限('') 

   提示:如果你啓動svnserve時通過-r指定了版本庫,這是svnserve僅提供一個版本庫給網絡,對目錄設置權限時可以不指定版本庫的名稱。
    如果你啓動svnserve時爲指定版本庫,即svnserve提供多個版本庫給網絡,這是設置路徑權限時需要指定版本庫的名稱。
    實例1:使用svnserve -d -r /var/svn/project1啓動Subversion服務,
           如果需要指定目錄設置權限路徑應該爲[/]或[/test],即這裏的根(/)僅表示project1版本庫,/test表示project1下的test目錄。
    實例2:使用svnserve -d啓動Subversion服務,即發佈所有的版本庫至網絡,
           如果需要指定目錄設置權限路徑應該爲[projet1:/]或[project2:/test],即這裏的[project1:/]僅表示project1版本庫的根,[project2:/test]表示project2下的test目錄。
    5. 客戶端訪問:
    客戶端我們使用Windows下的TortoiseSVN圖形工具,可以在http://tortoisesvn.net/downloads.html網站下載該程序。
    效果如圖:

三、SSH+SVN示例
    這種模式需要提前設置SSH服務,通過SSH服務調用SVN服務程序,所以svnserve不需要手動啓動,客戶端通過svn+ssh://centos.example.com/svn/project1訪問。
    客戶端程序通過ssh程序連接版本庫主機,使用SSH認證(服務器系統用戶名與密碼),服務端接到某用戶的ssh連接後會以該用戶的身份啓動svnserve。
    這種模式svnserve.conf還是可以進行權限控制的。
    1. 服務端啓動SSH服務
    [root@centos6 ~]# service sshd start
    2. 服務端創建版本庫
    [root@centos6 ~]# mkdir /var/svn
    [root@centos6 ~]# svnadmin create /var/svn/project1
    [root@centos6 ~]# svn import /shells  file:///var/svn/project1 -m "Initial DATA"
    3. 客戶端訪問效果如圖:
    1)通過TortoiseSVN圖形工具訪問:

    2)通過命令行訪問(一臺rhel6.2系統)


四、Apache+SVN
    Apache是非常流行的Web服務器軟件。它可以運行在幾乎所有的計算機平臺上。通過Apache發佈Subversion的版本庫,使得用戶可以通過HTTP協議訪問版本庫。
    以下爲使用Apache發佈Subversion版本庫的若干理由:
    1.Subversion可以使用Apache自身集成的多種認證方式。
    2.不需要創建系統用戶。
    3.完善的Apache日誌可。
    4.可以通過SSL加密網絡傳輸的數據。
    5.HTTP(S)可以穿越企業防火牆。
    6.堅定地通過瀏覽器訪問版本庫。
    準備工作:安裝Apache,加載mod_dav及mod_dav_svn模塊,Apache需要這兩個模塊管理Subversion版本庫。
    本文以yum方式安裝這些軟件,環境爲CentOS6.2。
    [root@centos6 ~]# yum -y install httpd
    [root@centos6 ~]# yum -y install mod_dav_svn
    安裝完成後你可以通過以下方法查看dav模塊是否加載成功:
    vim /etc/httpd/conf/httpd.conf
    查看是否包含LoadModule dav_module modules/mod_dav.so
    vim /etc/httpd/conf.d/subversion.conf
    查看是否包含LoadModule dav_svn_module modules/mod_dav_svn.so
    如果你還需要Subversion自帶的基於目錄的權限控制的話,可以通過加載mod_authz_svn實現。
    接下來通過修改Apache配置文件實現網絡化版本庫:
    root@centos6 ~]# mkdir /var/svn
    [root@centos6 ~]# svnadmin create /var/svn/project1
    [root@centos6 ~]# svn import /shells  file:///var/svn/project1 -m "Initial DATA"
    [root@centos6 ~]# vim /etc/httpd/conf.d/subversion.conf

  1. LoadModule dav_svn_module     modules/mod_dav_svn.so     //加載模塊 
  2. LoadModule authz_svn_module   modules/mod_authz_svn.so //加載模塊 
  3.  
  4. #                                                     //#符號開頭的爲註釋行 
  5. #   a) readable and writable by the 'apache' user, and
  6. # //默認Apache啓動用戶爲apache,所以需要apache用戶對版本庫有讀寫權限
  7. #   b) labelled with the 'httpd_sys_content_t' context if using
  8. #   SELinux 
  9. # //如果開啓了SELinux版本庫需要有httpd_sys_content_t這樣的安全上下文
  10. # To create a new repository "http://localhost/repos/stuff" using 
  11. # this configuration, run as root: 
  12. #   # cd /var/www/svn 
  13. #   # svnadmin create stuff   
  14. #   # chown -R apache.apache stuff 
  15. #   # chcon -R -t httpd_sys_content_t stuff     //以上註釋行是配置文檔提供的操作示例 
  16.                                                //注意我們的版本庫在/var/svn目錄下 
  17.  
  18. <Location /svn>                         //Location可以根據特定的URL執行特定的處理 
  19. //這裏當用戶的RUL以/svn開始時,將控制權交於DAV處理(http://hostname/svn/...) 
  20.    DAV svn 
  21.    SVNParentPath /var/svn               //通過SVNParentPath指定所有版本庫的主目錄(發佈所有版本庫) 
  22.                                         //也可以通過SVNPath指定某個特定版本庫的路徑(發佈特定版本庫) 
  23.       AuthType Basic                    //認證方式 
  24.       AuthName "Please Input passwod"  //提示字符 
  25.       AuthUserFile /var/svn/.pass       //帳號文件的路徑,爲了安全隱藏該文件 
  26.       Require valid-user                //指定僅有效用戶可以訪問 
  27. </Location> 

    [root@centos6 ~]# chown -R apache.apache  /var/svn/                //修改權限
    [root@centos6 ~]# chcon -R -t httpd_sys_content_t stuff /var/svn   //僅在SELinux開啓時使用
    [root@centos6 ~]# htpasswd -c /var/svn/.pass  jerry        //創建帳號文件,並添加用戶jerry
    [root@centos6 ~]# service httpd start
    客戶端訪問效果如圖:

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