一、What‘s is a subversion
Subversion(SVN)是一個開源的,跨平臺的版本控制系統,由CollabNet公司成立於2000年;Subversion作爲新一代的版本管理系統,以其目錄版本化、原子提交、版本化的元數據、更加有效的分支和標籤等特性,至今已被衆多的互聯網企業使用來管理網站、論壇的代碼文件;Subversion最獨特的地方,便是可以通過Apache的擴展模塊與Apache的HTTP服務相結合,實現更安全的特性與管理,其次用戶還可以通過HTTP協議去訪問版本庫,還可以通過SSL協議傳輸加密,保證數據的安全性;Subversion是Apache軟件基金會的發展的一個項目,並且也是一個豐富的開發人員和用戶社區的一部分。
Subversion存儲版本數據方式2種:BDB(一種事務安全型表類型)和FSFS(一種不需要數據庫的存儲系統)。因爲BDB方式在服務器中斷時,有可能鎖住數據,所以還是FSFS方式更安全一點;那麼在創建Subversion版本控制倉庫的時候,可以指定存儲版本數據爲FSFS方式;
二、Svbsersion系統邏輯架構圖
三、安裝與配置
3、1 服務器資源列表
服務器名稱 | 系統 | CPU架構 | 內核 | IP地址 | 角色 |
storage | CentOS 6.3 | x86_64 | 2.6.32-279.el6.x86_64 | 10.16.10.31 | SVN服務器 |
3、2 安裝
3、2、1 CentOS系統下安裝
[root@storage ~]#rpm -qa | grep subversion
[root@storage ~]#yum install subversion
3、2、2 Ubuntu系統下安裝
[root@ubuntu ~]#dpkg -l subversion
root@host-93:~#apt-get install subversion
3、2、3 關於Subversion 組件
1)svn
命令行客戶端程序;
2)svnversion
顯示工作拷貝的狀態,即當前項目修訂的版本;
3)svnlook
服務器端直接查看Svbversion版本庫的工具;
4)svnadmin
服務器端建立、調整和修復Subversion版本庫的工具;
5)svndumpfilter
過濾Subversion版本庫轉存數據流的工具;
6)mod_dav_svn
Apache HTTP服務器的一個模塊,使版本庫可以通過網絡訪問;
7)svnserve
服務器端程序,用來啓動SVN服務的守護進程;
8)svnsync
可以通過網絡增量鏡像版本庫的程序;
3、2、4 驗證安裝結果
[root@storage ~]# svn --version svn, version 1.6.11 (r934486) compiled Jun 23 2012, 00:44:03 Copyright (C) 2000-2009 CollabNet. Subversion is open source software, see http://subversion.tigris.org/ This product includes software developed by CollabNet (http://www.Collab.Net/). The following repository access (RA) modules are available: * ra_neon : Module for accessing a repository via WebDAV protocol using Neon. - handles 'http' scheme - handles 'https' scheme * ra_svn : Module for accessing a repository using the svn network protocol. - with Cyrus SASL authentication - handles 'svn' scheme * ra_local : Module for accessing a repository on local disk. - handles 'file' scheme
##備註
當前Subversion版本爲1、6,默認版本數據存儲方式爲FSFS;從顯示的結果上,我們還可以知道Subversion支持基於http,https協議訪問版本庫,支持本地、遠程導入項目與SASL的驗證方式;
3、3 創建版本庫
[root@storage ~]#mkdir /data/svn –p
[root@storage ~]#svnadmin create --fs-type fsfs /data/svn/repos
##提示:
自Subversion1、1引入了基於文件系統的“fsfs”,而且在Subversion1、2之後變成默認選項,如果你使用的Subversion是1、2以後的版本,創建版本庫時則可省略參數“- -fs-type fsfs”;如果你想使用BDB後端來代替fsfs,那麼在創建你的版本庫時就需要指定“—fs-type bdb”;
關於兩種版本庫數據儲存的優缺點可以參考
3、3、1 版本庫數據儲存對照表
#值得恭喜你的是,一個新的版本庫已經被創建,現在你可以執行ll命令查看一下版本庫的結構;
[root@storage ~]#ll /data/svn/repos/
##提示
conf目錄下存放了版本庫的配置文件,以及用戶驗證文件和訪問權限控制文件,文件本身的註釋說明十分詳細,讀者可以根據註釋自行配置;db 目錄下存放着 Subversion 所要管理的所有受版本控制的數據,不同的存儲方式(Berkeley DB 或者FSFS)下有着不同的目錄結構,不過我們一般不用直接修改和查看這個目錄下的內容,Subversion 的命令可以安全的操作這個目錄;另外,hooks 目錄存放着鉤子腳本及其模版(一種版本庫事件觸發程序),locks 目錄存放着Subversion 版本庫鎖定數據,format 文件記錄了版本庫的佈局版本號。
3、4 創建項目
#項目是需要自己去創建的,以後用來存儲用戶提交(commit)的數據,以下是目錄樹結構,請自行創建;
3、4、1 導入項目
[root@storageconf]# svn import /storage/bbs/ file:///data/svn/repos/ -m 'forum storage '
Adding/storage/bbs/trunk
Adding/storage/bbs/branches
Adding/storage/bbs/tags
Committed revision1.
##備註
import關鍵字告訴subversion,我們想做的是把一些文件導入到項目倉庫之中,參數‘-m‘使得你可以給這次的導入操作關聯一條信息;你可能注意到file:///選項,它告訴Subversion到本地文件系統中尋找項目倉庫,然後導入到項目/storage/bbs。
3、4、2 查詢導入結果
[root@storage ~]# svnlist --verbose file:///data/svn/repos/
1 rootMay 14 02:52 ./
1 rootMay 14 02:52 branches/
1 rootMay 14 02:52 tags/
1 rootMay 14 02:52 trunk/
##備註
此時,項目已經成功導入到版本庫中,也許你會有疑問,trunk,tags,branches目錄的作用是什麼,分別用來存儲什麼數據,我想說的是大部分的項目都會有一條主線開發(branches),而且大部分的工作都是在那裏完成的,其次項目還可能有發佈分支(trunk),存放的是已經完成的代碼,是發佈上線使用後存放在那裏的,不會經常被改動,除了需要修正bug,添加新功能的時候。最後,項目生命週期中的重大事件經常需要使用標籤(tags)來記錄,通常一個標籤會包含代碼發佈的版本號(revision)。
3、4、3 查詢版本庫詳細信息
[root@storage ~]# svn info file:///data/svn/repos/ Path: repos URL: file:///data/svn/repos Repository Root: file:///data/svn/repos Repository UUID: 80e85530-0b77-4a69-94af-6c50810b2a5e Revision: 1 Node Kind: directory Last Changed Author: root Last Changed Rev: 1 Last Changed Date: 2014-05-14 02:52:45 -0700 (Wed, 14 May 2014)
##備註
根據顯示的信息,我們可以知道版本庫的路徑是repos,URL的本地路徑爲file:///data/svn/repos,版本的所有者,UUID,版本號,以及上次變更的用戶,具體時間等;
3、5 配置
3、5、1svnserve.conf文件,如下所示:
[root@storage ~]# cd /data/svn/repos/conf/ [root@storage conf]# vim svnserve.conf anon-access = none #指定匿名用戶是否有權限訪問版本庫,無(none); auth-access = write #指定驗證用戶是否有權限訪問版本庫,寫(write); password-db = passwd #指定用戶的驗證文件 authz-db = authz #指定用戶訪問權限控制文件
3、5、2authz文件,如下所示:
[aliases] # joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average [groups] admin = zhangsan,hechunyang test = liutong,zhangbo [repos:/] @admin = rw @test = r
##備註
1)Groups 定義用戶組,一個用戶組可以包含一個或多個用戶,用戶之間用逗號分隔,如下所示:
用戶組= 用戶,用戶
admin = zhangsan,hechunyang
2)[repos:/] 定義版本庫的格式與訪問權限,“repos”表示版本庫,“:/”表示版本庫下的所有項目,關於權限的分配:w(寫),r(讀),“”(空)則表示不分配權限給用戶或用戶組,如下所示:
[repos:/]
@admin = rw
liutong = r
##提示
@admin= rw表示定義用戶組的權限,用戶組以“@”開頭,授予其組中成員可讀可寫的權限;
Liutong= r表示定義用戶的權限,授予可讀權限;
* = 表示全部的用戶,權限爲空,即沒有任何權限;
3、5、3 passwd文件,如下所示
[users] zhangsan = 123456 liutong = 123456 hechunyang = 123qwe zhangbo = 123456
##提示
passwd文件本身註釋說明十分的詳細,它告訴你如何去定義訪問版本庫的用戶名以及密碼,也給了示例,格式爲:用戶名 = 密碼;我們可以看到密碼是以明文的方式出現,顯然十分的不安全,通過HTTP,HTTPS,SSL可以實現對用戶密碼md5加密,網據傳輸數據加密,還可以通過web瀏覽器訪問SVN服務器內置的版本庫。
3、5、4 啓動SVN服務進程
[root@storage ~]# svnserve -d -r /data/svn/ [root@storage ~]# netstat -lntp | grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 47494/svnserve [root@storage ~]# ps -ef | grep svnserve root 47494 1 0 May14 ? 00:00:00 svnserve -d -r /data/svn/
四、客戶端安裝與測試
4、1 下載TortoiseSVN
4、2 安裝TortoiseSVN
4、3 簽出SVN項目
##提示
a)svn://10.16.10.31/repos,10.16.10.31表示SVN服務器的IP地址,repos爲SVN的版本庫;
b)F:\storage,表示把版本庫repos中的項目簽入本地磁盤F下storage目錄;
##提示
服務器端配置沒有錯誤的話,輸入passwd文件中指定的用戶名與密碼,便可把項目簽出至本地;
##提示
可以看到bbs項目被簽出到本地的F盤的storage目錄下,後期開發組的成員會在相應的目錄下完成所有的開發工作;
4、4 測試
##提示
研發人員在branches(主線)目錄創建hello.txt文件,右鍵選擇add添加文件,然後右鍵commit提交數據;
4、5 SVN更新
[root@webserver2~]# mkdir /storage
[root@webserver2~]# yum install subversion
[root@webserver2~]# svn co svn://10.16.10.31/repos /storage/ --username=zhangsan
##提示
我們已經把開發組成員提交的數據,成功更新至測試服務器的/storage目錄下,其中參數co(checkout)簽出數據,--username=zhangsan表示以張三用戶的身份驗證;
在寫這篇文檔之前,我瀏覽許多朋友的博客,看過Subversion相關的書籍,並結合實際工作中的經驗寫下這篇文檔,希望能夠幫助到需要的朋友。