1》Subversion版本控制簡介: Subversion(SVN)是一款自由開放的版本控制軟體,可以管理文件,文件夾以及記錄他們的修改狀況,常用來幫助我們管理軟體開發的源代碼或是公司手冊文檔。SVN通過將文檔導入至版本庫中進行管理,版本庫類似於文件伺服器,但比文件伺服器更強大的是,它可以記錄用戶 ...
1》Subversion版本控制簡介:
Subversion(SVN)是一款自由開放的版本控制軟體,可以管理文件,文件夾以及記錄他們的修改狀況,常用來幫助我們管理軟體開發的源代碼或是公司手冊文檔。SVN通過將文檔導入至版本庫中進行管理,版本庫類似於文件伺服器,但比文件伺服器更強大的是,它可以記錄用戶每一次對文件或目錄的修改狀況,並提供還原數據至老版本的功能;版本控制對於軟體開發而言是至關重要的,現在的軟體開發一般作為項目進行,一個項目中會有很多人參加,那麼每個人手中都有自己的一份修改備份,最後誰的版本是最新的?有時一款軟體開發出來之後會有很多個版本,比如1.0版本,2.0版本,而且每個大版本下還有小版本號,1.1.1,2.1.1,等版本,SVN可以幫助我們很好地管理這些代碼;
2》SVN架構圖:
從下圖可以看出,伺服器端保存著Subversion的版本庫,客戶端通過命令或圖形工具連接到伺服器,並建立本地“工作副本”,也就是從伺服器端將版本庫中的資料複製到客戶端本地,當然,客戶端主機可以將自己本地的版本更新至伺服器版本庫,而客戶端可以通過三種方式連接到伺服器取得版本庫中的數據:
版本庫(Svn Repository)---------------------->伺服器端
========================================================
Apache
mod_dav SVN
mod_dav_suv
Internet
--------------------------------------------------------------------------------------------------
DAV SVN Local
版本庫訪問
===========================================================
命令行或圖形工具------------------------------》客戶端
3》Subversion伺服器:
客戶端訪問伺服器時可以通過三種方式訪問:svnserve訪問,svnserve+ssh訪問,Apache間接訪問;
svnserve是一個小巧,輕便的伺服器程式,客戶端通過使用SVN專用的協議進行訪問,其特點是簡單;由於svnserve本身並不提供數據加密通信的功能,所以,如果需要更加安全的連接,可以使用svnserve+ssh的方式與伺服器建立SSH隧道連接,再通過SSH調用svnserve程式,實現數據的安全加密傳輸;Apache通過mod_dav_svn模塊可以訪問版本庫,這樣客戶端可以通過訪問Apache取得版本庫資料,從而完成對數據的版本控制;
*************
Apache+DAV svnserve svnserve+SSH
認證 HTTP基本認證,LDAP,證書 支持MD5認證 SSH認證
許可權 可對版本庫整體設置許可權,也可對 可對版本庫整體設置許可權,也可對 僅對版本庫 整體設置許可權
指定目錄設置許可權 指定目錄設置許可權
加密 支持SSL加密 無 支持SSH隧道加密
日誌 完善的Apache日誌 無 無
速度 慢 快 快
設置 相對複雜 簡單 相對簡單
4》SVN伺服器搭建:
1>安裝SVN軟體:
yum -y install subversion
2>搭建伺服器:
版本庫軟體安裝完成以後,我們首先要做的是創建一個版本庫,svnadmin工具是SVN軟體所提供的版本庫管理工具,該工具可以用來創建庫,備 份庫,修訂版本等操作;其次我們還需要為版本庫建立一套有效的認證機制以增強版本資料庫的安全性,最後當伺服器端的所有設置均完成後,啟動 伺服器端相應的服務進程即可;
1)創建伺服器版本庫:
利用svnadmin命令可以創建伺服器版本庫;
描述:subversion版本庫管理工具,通過svnadmin help可以查看命令幫助;
用法:svnadmin 命令 /版本庫路徑【選項】
命令:
create 創建一個新的版本庫
hotcopy 版本庫熱備
lslocks 列印所有的鎖描述
svnadmin實例:
svnadmin create /var/svn/project1
svnadmin hotcopy /var/svn/project1 /var/svn/projet1_copy
svnadmin lslocks /var/svn/project1
ABC公司近期剛剛接到一個網站項目,由於項目開發是多人進行的,所以公司希望使用版本控制系統高效地管理項目代碼,項目代碼保存 在/var/web_code目錄下,下麵我們將為該項目創建名為web_project的版本庫:
mkdir /var/svn
svnadmin create /var/svn/web_project
通過svnadmin命令已經創建了一個名為web_project的空版本庫,下麵我們將使用svn命令將項目代碼導入到版本庫中,import代表執行導入操 作,將本地web_code目錄下的資料導入到剛剛創建的空版本庫web_project中,-m後面跟的是說明性的字元串,可以為任意字元:
svn import /var/web_code/ file:///var/svn/web_project/ -m "Initial DaTa"
svn list file:///var/svn/web_project 列出版本庫中的資料列表
2)認證與授權
使用SVN內置的認證機制可以有效地增強客戶端訪問版本庫的安全性,當客戶端訪問版本庫伺服器時,伺服器會根據版本庫目錄下的 conf/svnserve.conf文件中定義的認證與授權策略實現許可權的控制,下麵是該文件的核心配置說明:
在svnserve.conf中已經配置好了賬戶密碼文件,下麵分別看看passwd與authz文件的內容,預設該文件存放在版本庫的conf目錄下,在 passwd文件中需要設置賬戶信息,在authz文件中需要設置訪問控制許可權;
3)啟動svnserve服務:
svnserve命令的描述和用法如下:
描述:SVN伺服器程式
用法:svnserve [選項]
選項:
-d 以守護進程方式運行svnserve
--listen-port=port 指定監聽的埠,預設監聽埠號為3690
-r 為版本庫指定一個虛擬路徑,預設客戶端要指定絕對路徑訪問庫
直接運行svnserve命令即可啟動SVN服務進程,但如果需要該服務作為後臺程式持續監聽客戶端訪問,可以使用-d選項使該程式以守護進 程的方式啟動svnserve服務,SVN服務預設監聽埠為3690,如果防火牆處於開啟狀態,需要註意對防火牆的正確設置;svnserve運行後,會將 所有版本庫發佈至網路(假設有多個版本庫);此時,客戶端需要指定絕對路徑訪問版本庫,如;svn://centos.example.com/var/svn/web_project, 同時伺服器端如果需要在authz文件中為目錄設置許可權,路徑應該為[web_project:/]或[project2:/test],即這裡的[web_project:/]表示web_project是版 本庫的根,[project2:/test]表示project2下的test目錄;
預設SVN會將伺服器電腦中所有的版本庫共用給網路用戶,但有時我們僅希望發佈其中一個版本庫時,就需要限制僅發佈web_project 一個版本到網路中,這樣客戶端也可以使用相對路徑訪問版本庫,如:svn://centos.example.com/web_project(客戶端會訪問服務/var/svn/目錄下 的web_project項目),同時,伺服器端如果需要在authz文件中為目錄設置許可權,路徑應該為[/]或[/test],即這裡的根(/)僅表示web_project版本 庫,/test表示web_project下的test目錄;如果需要發佈個別版本庫給網路用戶,可以使用svnserve 命令的-r 選項,該選項後面接版本庫的路徑:
svnserve -d -r /var/svn
4)客戶端訪問:
版本庫伺服器創建完成後,我們可以通過多種方式訪問SVN伺服器的版本庫,可以使用命令行或者圖形工具,也可以通過本地磁碟或網路 協議訪問,但不管你使用哪種方式,都需要提供一個URL地址來定位版本庫的位置,每種URL的使用格式及含義示下:
file:/// 直接訪問本地磁碟上的版本庫(客戶端與伺服器端在一臺機器上)
http:// 配置Apache的WebDAV協議,通過網頁訪問版本庫
https:// 與http://相似,但使用了SSL進行數據加密
svn:// 通過svnserve定義的協議訪問版本庫
svn+ssh:// 與svn://相似,但使用了SSH封裝加密數據
在客戶端訪問伺服器版本庫的眾多方法中,命令行的方式是高效,功能完善,無須安裝第三方軟體的一種簡單方式,SVN軟體為我們提供 了一個名為svn的命令行程式;
(1)svn命令:
描述:subversion客戶端命令行工具
用法:svn 命令 【選項】
選項:
--password 密碼
--username 用戶名
--revision(-r) 指定要檢查的特定版本
命令:
add 添加文件,目錄或符合鏈接
cat 輸出特定文件的內容
checkout URL[@REV] [PATH]
從伺服器版本庫中複製一份副本到本地,URL定位版本庫,通過REV可以下載特定版本的數據,PATH為本地工作副本路徑:
commit 將本地工作副本修改後的內容發佈至版本中,簡寫為ci
copy SRC DST 將工作副本中的一個文件或目錄複製到版本庫中
delete PATH 從本地工作副本中刪除一個項目
delete URL 從版本庫中刪除一個項目
diff 對比兩個版本之間的差別
import 提交一個路徑的副本至版本庫中
info 顯示本地或遠程版本信息
svn實例:
svn checkout file:///var/svn/project1 mine
svn co svn://192.168.0.254/project1 mine
svn commit -m "modified foo.html"
svn commit -m "modified foo.html" /mine
svn delete testfile
svn diff
svn import -m "New project" /etc file:///var/svn/project
svn info
svn info svn://172.16.0.118/var/svn/web_project
除了核心的svn命令,SVN軟體包還提供了一個用於對版本庫數據信息進行簡單查詢的工具,svnlook命令可以幫助用戶完成這些查詢工作;
(2)svnlook命令
描述:subversion檢查工具,通過svnlook help可以查看命令幫助;
用法:svnlook 命令 /版本庫路徑 【選項】
選項:--revision(-r) 指定要檢查的特定版本
命令:
author 顯示作者
cat 顯示版本庫中的文件內容
date 顯示時間標記
log 顯示日誌消息
tree 顯示版本庫資料樹
svnlook實例:
svnlook author /var/svn/web_project
svnlook author -r 2 /var/svn/web_project 查看版本2的作者信息
svnlook cat /var/svn/web_project a.text 查看版本庫中a.text文件的內容
我們可以使用svn命令或圖形工具連接版本庫伺服器,下載版本數據到本地,通過圖形方式在本地電腦生成本地副本版本,圖形工具 選的是windows平臺的TortoiseSVN軟體,安裝完成該軟體後,在桌面點擊滑鼠右鍵即可找到該工具,它是免費的基於GPL開發的開源自由軟 件,它是subversion版本控制系統的一個非常優秀的客戶端程式,可以幫助我們高效地管理文件與目錄,我們可以在http://tortoisesvn.net/網站 上找到下載鏈接,該軟體還提供了多語言軟體包(包括中文);
5》svnserve+SSH伺服器搭建:
由於svnserve並不支持加密,所以對公司的數據安全危害比較大,基於SSH的svnserve使得客戶端可以通過SSH服務調用SVN服務程式,客戶端需要 使用ssh程式連接遠程伺服器的SSHD服務,通過SSH認證機制驗證賬戶身份後,再自動啟動svnserve服務,所以伺服器端不需要提前啟動SVN服務;在這 種模式下,svnserve.conf配置文件依然可以進行許可權控制,伺服器部署流程是啟動SSH服務,在伺服器上創建版本庫,向版本庫中導入數據,最後客戶端 使用命令或圖形方式訪問伺服器,具體操作步驟如下:
1>伺服器端啟動SSHD伺服器:
service sshd start
chkconfig sshd on
2>伺服器端創建版本庫:
svnadmin create /var/svn/web_project2
svn import /var/cofe2 file:///var/svn/web_project2 -m "Web code"
3>客戶端訪問:
svn co svn+ssh://172.16.0.118/var/svn/web_project2 /web_code2
6》Apache+SVN伺服器搭建:
雖然前面兩種伺服器類型已經可以滿足大多數人的使用需求,但當客戶端沒有任何工具可以使用時,我們還可以創建基於Apache的SVN伺服器,這樣 客戶端只要有瀏覽器,就可以訪問版本庫伺服器,Apache是目前非常流行的Web伺服器軟體,它允許在幾乎所有的電腦平臺上運行,目前絕大多數系統 平臺都可以部署Apache Web Server,使用它訪問版本庫需要載入mod_dav與mod_dav_svn模塊,Apache需要通過這兩個模塊才可以管理subversion版 本庫,使用Apache發佈subversion版本庫的好處有:
subversion可以使用Apache的多種認證方式;
不需要創建系統賬戶;
Apache提供了完善的日誌功能;
可以通過TLS進行數據加密;
HTTP以及HTTPS可以穿越企業防火牆;
客戶端簡單地通過瀏覽器訪問版本庫;
1>創建版本庫:
svnadmin create /var/svn/web_project3
svn import /var/web_code3 file:///var/svn/web_project3 -m "Term 3"
2>安裝Apache及相關模塊軟體:
yum -y install httpd
yum -y install mod_dav_svn
3>修改Apache配置:
為了讓Apache Web Server 可以讀取SVN版本庫中的數據,我們需要修改httpd針對SVN的配置文件subversion.conf,在該文件中至少確保 mod_dav和mod_dav_svn兩個模塊會被載入,還要確保/etc/httpd/conf/httpd.conf文件中dav_module模塊也會被載入;另外為了滿足用戶對數據安全的 需求,我們還可以利用httpd的認證模塊實現基於賬戶和密碼的訪問機制;
chown -R apache.apache /var/svn 修改許可權
chown -R -t httpd_sys_content_t /var/svn 僅當SELinux開啟時使用
htpasswd -c /var/svn/.pass jerry 創建賬戶文件,添加jerry用戶
service httpd start
chkconfig httpd on
4>客戶端訪問
我們可以使用任何一款瀏覽器通過URL訪問版本庫數據,通過地址加埠和版本庫根目錄訪問;
7》常見問題:
1>訪問版本庫路徑錯誤:
如果通過svnserve命令啟動服務時指定了發佈的具體版本庫,則客戶端訪問時就可以直接使用相對路徑訪問,如果伺服器端使用svnserve -d -r /var/svn 啟動服務後,客戶端依然使用svn co svn://172.16.0.118/var/svn/web_project /mine ,系統將提示:svn:No repository found,說明沒有 找到該版本庫,正確的寫法是svn co svn://172.16.0.118/web_project mine;
2>每次想訪問版本庫時,進程就會掛起:
首先確保版本庫沒有被破壞,數據也沒有丟失,當進程直接訪問版本庫時,進程將通過Berkeley DB來實現,Berkeley DB包含日誌系統,也就是 說,所有的操作在執行前都被記錄在日誌中;當進程崩潰時,遺留下文件鎖,並記錄了所有未完成操作的信息,從而導致所有試圖訪問資料庫的進程 將因為要訪問文件鎖而被掛起,若想解除文件鎖,可以回滾到前一個正常狀態;
3>subversion提示工作副本已過時:
這可能是提交失敗導致了你的工作副本被破壞,可以使用svn revert回滾,svn update更新來解決該問題;
4>Windows XP下,subversion伺服器有時會發佈一些錯誤數據:
如果你是在windows平臺下搭建subversion伺服器,可以嘗試通過安裝SPI補丁包解決該問題;
5>Apache拒絕訪問:
通過瀏覽器訪問版本庫時提示:You don't have permission to access /svn on this server;出現這種提示說明沒有許可權讀取相應的目錄,如 用戶在這裡輸入:http://172.16.0.118/svn,就會得到這樣的提示,正確的輸入應為http://172.16.0.118/svn/web_project;