天天看點

Subversion版本控制

Subversion版本控制

一、簡介

二、svnserve

三、SSH+SVN

四、Apache+SVN

一、簡介:

Subversion是一款自由開放的版本控制軟體。Subversion可以管理檔案、檔案夾以及記錄它們的修改狀況。Subversion常用來幫助我們管理軟體開發的源代碼或是公司手冊文檔。

Subversion通過将文檔導入至版本庫中進行管理,版本庫類似于檔案伺服器,但比檔案伺服器更強大的是它可以記錄你每一次對檔案或目錄的修改狀況,并提供還原資料至老版本的功能。

版本控制概念圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201208/075908216.png"></a>

Subversion架構圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201208/080009593.png"></a>

從圖中可以看出服務端儲存着Subversion版本庫,用戶端通過指令或圖形界面連接配接服務端,并建立本地“工作拷貝”(從服務端将版本庫中的資料拷貝至本地)。

用戶端通路服務端時可以通過簡單的svnserve通路、file本地通路、Apache間接通路。

1.svnserve是一個小巧、輕便的伺服器程式,通過它用戶端可以使用Subversion專有的協定進行通路,其特點是設定簡單。

2.由于svnserve本身并不提供加密通訊的功能,是以如果你需要更安全的連接配接,可以使用svnserve+ssh的方式,通過連接配接SSH伺服器建立在SSH隧道,在通過SSH調用svnserve程式。

3.Apache通過mod_dav_svn通路版本庫,使得客戶可以通過通路Apache取得版本庫資料進行版本控制。

Subversion伺服器對比圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201208/080055695.png"></a>

二、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

 ... 

[general] 

# anon-access = read            //匿名使用者權限為隻讀,此處可以設定為none,read,write 

# auth-access = write           //經過認證的使用者權限為可寫 

# password-db = passwd          //指定使用者存放使用者名與密碼的檔案,該檔案位于conf目錄下名為passwd 

# authzauthz-db = authz         //指定基于版本庫路徑的通路控制(可以對檔案或目錄設定權限) 

# real = My First Repository    //設定版本庫域,如果兩個版本庫的認證域相同,他們将使用相同的密碼資料 

... 

提示:以上設定行預設全部為注釋行,如果需要可以根據自己的需要去除注釋。 

    下面我們來看看passwd與authz檔案格式:

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

[users] 

# harry = harryssecret      //使用者名為harry密碼為harryssecret 

# sally = sallyssecret      //使用者名為sally密碼為sallyssecret 

提示:以上内容預設同樣為注釋行,如果需要可以去除#注釋,或是添加自己的新使用者與密碼。 

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

[groups] 

admins = harry,sally  //定義組,組成員有harry與sally 

[/]                   //對版本庫根路徑設定權限,可以設定為你需要控制的路徑 

@admins = rw          //admins組中的使用者使用者可讀,可寫權限 

* = 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網站下載下傳該程式。

    效果如圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201208/081342882.png"></a>

<a target="_blank" href="http://blog.51cto.com/attachment/201208/081400554.png"></a>

三、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. 服務端建立版本庫

    3. 用戶端通路效果如圖:

    1)通過TortoiseSVN圖形工具通路:

    2)通過指令行通路(一台rhel6.2系統)

    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 ~]# vim /etc/httpd/conf.d/subversion.conf

LoadModule dav_svn_module     modules/mod_dav_svn.so     //加載子產品 

LoadModule authz_svn_module   modules/mod_authz_svn.so //加載子產品 

#                                                     //#符号開頭的為注釋行 

#   a) readable and writable by the 'apache' user, and

# //預設Apache啟動使用者為apache,是以需要apache使用者對版本庫有讀寫權限

#   b) labelled with the 'httpd_sys_content_t' context if using

#   SELinux 

# //如果開啟了SELinux版本庫需要有httpd_sys_content_t這樣的安全上下文

# To create a new repository "http://localhost/repos/stuff" using 

# this configuration, run as root: 

#   # cd /var/www/svn 

#   # svnadmin create stuff   

#   # chown -R apache.apache stuff 

#   # chcon -R -t httpd_sys_content_t stuff     //以上注釋行是配置文檔提供的操作示例 

                                               //注意我們的版本庫在/var/svn目錄下 

&lt;Location /svn&gt;                         //Location可以根據特定的URL執行特定的處理 

//這裡當使用者的RUL以/svn開始時,将控制權交于DAV處理(http://hostname/svn/...) 

   DAV svn 

   SVNParentPath /var/svn               //通過SVNParentPath指定所有版本庫的主目錄(釋出所有版本庫) 

                                        //也可以通過SVNPath指定某個特定版本庫的路徑(釋出特定版本庫) 

      AuthType Basic                    //認證方式 

      AuthName "Please Input passwod"  //提示字元 

      AuthUserFile /var/svn/.pass       //帳号檔案的路徑,為了安全隐藏該檔案 

      Require valid-user                //指定僅有效使用者可以通路 

&lt;/Location&gt; 

    [root@centos6 ~]# chown -R apache.apache  /var/svn/                //修改權限

    [root@centos6 ~]# chcon -R -t httpd_sys_content_t  /var/svn   //僅在SELinux開啟時使用

    [root@centos6 ~]# htpasswd -c /var/svn/.pass  jerry        //建立帳号檔案,并添加使用者jerry

    [root@centos6 ~]# service httpd start

    用戶端通路效果如圖:

本文轉自丁丁曆險51CTO部落格,原文連結: http://blog.51cto.com/manual/961815,如需轉載請自行聯系原作者

繼續閱讀