第1章SVN介紹及應用場景
1.1什么是SVN(Subversion)
Svn(subversion)是近年來崛起非常優秀的版本管理工具,與CVS管理工具一樣,SVN是一個跨平台的開源的版本控制系統。Svn版本管理工具隨着時間改變的各種數據。這些數據防止在一個中央資料檔案庫(repository)中,這個檔案庫很像一個普通的文件服務器或者FTP服務器,但是,與其他服務器不同,SVN會備份並記錄每個文件每一次的修改更新變動。這樣就可以把任意一個時間點的檔案恢復到想要的某一個舊的版本,當然也可以直接瀏覽指定文件的更新歷史記錄。
官方解釋:為什么會有SVN這樣一個項目?為了接管CVS的用戶基礎,確切的說,我們寫了一個新的版本控制系統,它和CVS很相似,但是它修正了以前CVS所沒有解決的許多問題。具體查看SVN官方首頁。
SVN是一個非常通用的軟件系統,它常被用來管理程序源碼,但是它也可以管理任何類型的文件,如文本、視頻、圖片等等。
1.2SVN與Git的區別
1.2.1SVN集中式版本控制系統
SVN版本控制系統是集中式的數據管理,存在一個中央版本庫,所有開發人員本地開發所使用的代碼都是來自於這個版本庫,提交代碼也都必須提交到這個中央版本庫。
SVN版本控制系統工作流程如下:
1.在中央庫上創建或從主干復制一個分分支。
2.從中央庫check out下這個分支的代碼。
3.增加自己的代碼文件,修改現存的代碼或者刪除代碼文件。
4.commit代碼,假設有人在剛剛的分支上提交了代碼,你就會被提示代碼過期,需要先up你的代碼后再提交。up代碼的時候如果出現沖突,需要解決好后再進行提交。
1.2.2Git分布式版本控制系統
git中沒有了中央版本庫的說法,但是為了開發小組的代碼共享,我們通常還是會搭建一個遠程git倉庫。
但是和svn不同的是,開發者本地也包含了一個完整的git倉庫,從某種程度上說本地的倉庫和遠程的倉庫在身份上是等價的,沒有主從之分。
如果是閉源項目,或者你習慣於以往的集中式的管理模式的話,那么在git下你也可以像SVN那樣的工作,只是流程中可能會增加一些步驟。
1.你本地創建一個git庫,並將其add到遠程git庫中。
2.你在本地添加或者刪除文件,然后commit,當然commit操作都是提交到本地的git庫中。(其實提交到git目錄下的objects目錄中)
3.將本地git庫的分支push到遠程git庫的分支,如果這個時候遠程git庫中已經有別人push過,那么遠程git庫將不允許你push,這時候你需要先pull,如果有沖突,先處理好沖突,commit到本地git庫后,再push到遠程git庫。
從上面的描述我們可以看到,我們每個開發人員的本地都會有一個git庫,我們可以隨時進行commit而不需要聯網,可以隨時查看歷史版本,當某一個功能點開發完了之后我們可以將commit后的內容push到遠程git庫了,如果遠程git庫的版本在你上次clone或者pull之后變化了,那么需要進行pull並處理沖突,提交之后,在push到遠程git庫。
1.3SVN企業應用場景
SVN任是當前企業的主流。git正在發展,未來會成為主流。如果大家精力足夠,建議同時掌握。
1.4運維人員掌握版本管理
對於版本管理系統,運維人員需要掌握的技術點:
1、安裝、部署、維護、拍障。
2、簡單使用,很多公司都是由開發來管理,包括建立倉庫和添加刪除賬號。
3、對於版本控制系統,運維人員相當於開發商,開發人員是業主,運維搭建的系統為開發人員服務。
1.5SVN服務運行模式與訪問方式
1.5.1Svn服務端運行方式
SVN服務常見的運行訪問方式有3種:
1、獨立服務器訪問
訪問地址如:svn://svn.xuliangwei.com/sadoc;
2、借助Apache等http服務
訪問地址如:http://svn.xuliangwei.com/sadoc;
單獨安裝Apache+svn
CSVN(apache+svn)是一個單獨的整合軟件,帶web界面管理的SVN軟件。
3、本地直接訪問(例如:file:///application/svndata/sadoc)
咱們主要學習第一種方式以及第二種方式的CSVN web管理方式。
1.6Svn客戶端訪問方式
Svn客戶端可以通過多種訪問方式訪問服務器端,例如:本地磁盤訪問,或各種各樣不同的網絡協議訪問,但一個版本庫地址永遠都是一個URL,URL反映了訪問方法。
訪問方式 |
說明 |
svn:// |
通過TCP/IP自定義協議訪問svnserve服務器。 |
http:// |
通過WebDAV協議訪問支持Subversion的Apache服務器 |
https:// |
與http://相似,但是用SSL加密訪問。 |
file:// |
直接通過本地磁盤或者網絡磁盤訪問版本庫。 |
svn+ssh:// |
通過認證並加密的TCP/IP自定義協議訪問svnserve服務器 |
1.7SVN檔案庫數據格式
SVN存儲版本數據有2中方式:BDB(一種事物安全性表類型)和FSFS(一種不需要數據庫的存儲系統)。因為BDB方式在服務器中斷時,有可能鎖住數據,所以還是FSFS方式更安全一點。
BDB:
伯克利DB(BerkeleyDB),版本庫可以使用的一種經過充分測試的后台數據庫實現,不能在通過網絡共享的文件系統上使用,伯克利DB是Subversion1.2版本以前的缺省版本庫格式。
FSFS:
一個專用於Subversion版本庫的文件系統后端,可以使用網絡文件系統(例如NFS或SMBFS)。是1.2版本及其后的缺省版本庫格式。
1.8SVN版本控制系統優點
1、管理方便,邏輯清晰明確,符合一般人思維習慣。
2、易於管理,集中式svn服務器更能保證數據安全性。
3、代碼一致性非常高。
4、適合開發人數不多的項目開發。
5、普及度高,大部分軟件配置管理的大學教材都是SVN。
第2章SVN版本系統最佳實踐
2.1SVN安裝部署
檢查操作系統環境,以及內核版本
[root@svn-node1 ~]# cat /etc/redhat-release #查看系統版本
CentOS release 6.7 (Final)
[root@svn-node1 ~]# uname -r #查看內核
2.6.32-573.el6.x86_64
SVN屬於功能性軟件,yum安裝即是最佳實踐。
[root@svn-node1 ~]# yum install subversion #安裝Svn
[root@svn-node1 ~]# rpm -qa subversion #檢查svn是否安裝完畢
subversion-1.6.11-14.el6.x86_64
2.2創建SVN目錄
建立svn版本庫數據存儲根目錄(svndata)及用戶、密碼權限目錄(svnpasswd)
[root@svn-node1 ~]# mkdir -p /application/svndata #數據存儲根目錄
[root@svn-node1 ~]# mkdir -p /application/svnpasswd #用戶、密碼權限目錄
2.3建立項目版本庫
創建一個新的Subversion項目sadoc,類似sadoc這樣的項目可以創建多個,每個項目對應不同的代碼,這里只是以創建一個項目為例演示:
[root@svn-node1 ~]# svnadmin create /application/svndata/sadoc #使用svnadmin創建項目版本庫,以及初始化版本庫
2.4調整SVN配置文件及權限文件
下面對svn全局配置文件進行配置管理:注意:修改位置頂格不能有空格,否則報錯
[root@svn-node1 ~]# cd /application/svndata/sadoc/conf/
[root@svn-node1 conf]# cp svnserve.conf svnserve.conf.ori #備份SVN主配置文件,方便對比
[root@svn-node1 conf]# egrep -v "^$|#" svnserve.conf #打開如下注釋的行
[general]
anon-access = none #read(匿名訪問) none(不讓匿名訪問)
auth-access = write #授權用戶可寫
password-db = /application/svnpasswd/passwd #使用哪個文件作為帳號密碼文件
authz-db = /application/svnpasswd/authz #使用哪個文件作為權限文件
realm = My xuliangwei First Repository #認證空間名,版本所在目錄(可選)
[root@svn-node1 conf]# mv authz passwd/application/svnpasswd/ #把密碼認證及權限模板拷到相關目錄
[root@svn-node1 conf]# chmod 600 /application/svnpasswd/{authz,passwd} #修改權限,不允許其他用戶讀寫執行權限
快速修改替換方法:
sed -i 's/# anon-access = read/anon-access=none/' svnserve.conf
sed -i 's/# auth-access = write/auth-access=write/g' svnserve.conf
sed -i 's@# password-db = passwd@password-db = /application/svnpasswd/passwd@g' svnserve.conf
sed -i 's@# authz-db = authz@authz-db = /application/svnpasswd/authz@g' svnserve.conf
2.5配置svn用戶及密碼
配置賬戶及密碼 格式: user=passwd
[root@svn-node1 svnpasswd]# egrep -v "^$|#" /application/svnpasswd/passwd
[users]
xuliangwei = xlw123
xiaomi = xiaomi123
stu001 = 123
stu002 = 456
提示:
1.等號前為SVN賬號,等號后為SVN密碼,密碼是明文的,注意密碼權限
2.更改svnserve.conf時,需要重起SVN,更改authz,passwd文件時不需要重啟
2.6配置svn用戶及權限
權限使用的用戶名,必須在passwd文件里面存在,權限配置文件的修改立即生效,不必重啟SVN;
用戶組格式:
[groups]
xuliangwei26 = stu001,stu002
其中,1個組可以包含1個用戶或者多個用戶,用戶間以逗號分隔。
版本庫目錄格式:
[<版本庫>:/項目/目錄]
@<用戶組名> = <權限>
<用戶名> = <權限>
方括號內部分可以有多種寫法:
[/] #表示根目錄及以下,根目錄是sevnserve啟動時指定的,我們指定為/application/svndata [/]就是表示對全部版本庫設置權限;
[sadoc:/] #表示對版本庫sadoc設置權限;
[sadoc:/linux] #表示對版本庫sadoc中的linux項目設置權限;
[sadoc:/linux/centos] #表示對版本庫sadoc中的linux項目的centos目錄設置權限;
權限主體可以是用戶組、用戶或者*,用戶組在前面加@,*表示全部用戶。
權限可以是r、w、rw和空,空表示沒有任何權限。
如下權限體系的控制
[root@svn-node1 svnpasswd]# egrep -v "#" /application/svnpasswd/authz
[aliases]
[groups]
xuliangwei26 = stu001,stu002
[sadoc:/]
xuliangwei = rw
[sadoc:/linux]
xiaomi = rw
[sadoc:/linux/centos]
@xuliangwei26 =r
根目錄只有xuliangwei可以讀寫,匿名用戶沒有任何權限。
二級Linux目錄只有xiaomi可以讀寫,匿名用戶沒有任何權限。
三級centos目錄只有xuliangwei26組可讀,但是xuliangwei可讀寫,xiaomi也可讀寫。
2.7svn啟動命令詳解
svn啟動命令詳解
[root@svn-node1 sadoc]# svnserve --help
usage: svnserve [-d | -i | -t | -X] [options]
Valid options:
-d [--daemon] : daemon mode #以守護進程運行
-i [--inetd] : inetd mode #以inetd模式運行
-t [--tunnel] : tunnel mode #以隧道模式運行
-X [--listen-once] : listen-once mode (useful for debugging) #調試模式
-r [--root] ARG : root of directory to serve #指定根目錄
-R [--read-only] : force read only, overriding repository config file #只讀,覆蓋庫的配置文件
--config-file ARG : read configuration from file ARG #從文件讀取配置
--listen-port ARG : listen port #指定監聽svn端口
[mode: daemon, listen-once]
--listen-host ARG : listen hostname or IP address #監聽主機名或者IP地址
[mode: daemon, listen-once]
-T [--threads] : use threads instead of fork [mode: daemon] #線程的使用
--foreground : run in foreground (useful for debugging) #在前台運行(調試模式)
[mode: daemon]
--log-file ARG : svnserve log file #指定日志文件
--pid-file ARG : write server process ID to file ARG #指定pid文件路徑
[mode: daemon, listen-once]
--tunnel-user ARG : tunnel username (default is current uid's name) #隧道用戶名(默認UID的名稱)
[mode: tunnel]
-h [--help] : display this help #查看幫助
--version : show program version information #顯示程序版本信息
2.8配置並啟動svn服務
[root@svn-node1 sadoc]# svnserve -d -r /application/svndata/#-d代表后台運行 -r 指定根目錄
[root@svn-node1 sadoc]# netstat -lntup|grep 3690 #查看SVN端口
tcp 00 0.0.0.0:36900.0.0.0:* LISTEN 1855/svnserve
第3章SVN客戶端管理
3.1Windows客戶端管理
windows客戶端下載TortoiseSVN軟件進行代碼的上傳、下載、提交、更新、等操作管理。
使用xuliangwei用戶來checkout
checkout 成功
添加新的文件,進行提交
通過browse瀏覽成功
3.2Linux客戶端管理
3.2.1SVN建立目錄樹
[root@svn-node1 /]# mkdir -p /tmp/dir/linux/centos
[root@svn-node1 /]# svn import /tmp/dir/ svn://10.0.0.3/sadoc/ -m "import svntree" #導入svn目錄樹
Adding /tmp/dir/linux
Adding /tmp/dir/linux/centos
3.2.2從SVN庫提取數據
將文件checkout到本地目錄
[root@svn-node1 ~]# mkdir /svn-data
[root@svn-node1 ~]# cd /svn-data
[root@svn-node1 svn-data]# svn co svn://10.0.0.7/sadoc/ /svn-data/ --username xuliangwei --password xlw123
3.2.3從本地提交到SVN
客戶端提交文件至SVN服務器,如下
[root@svn-node1 svn-sadoc]# mkdir stu00{10..12}
[root@svn-node1 svn-data]# svn add *
A stu0010
A stu0011
A stu0012
[root@svn-node1 svn-sadoc]# svn ci -m "Message data" --username xuliangwei --password xlw123
Adding stu0010
Adding stu0011
Adding stu0012
Committed revision 5.
第4章SVN備份實踐
[root@svn-node1 svn-sadoc]# svnadmin --help
general usage: svnadmin SUBCOMMAND REPOS_PATH[ARGS & OPTIONS ...]
Type 'svnadmin help <subcommand>' for help on a specific subcommand.
Type 'svnadmin --version' to see the program version and FS modules.
Available subcommands:
crashtest
create
deltify
dump
help (?, h)
hotcopy
list-dblogs
list-unused-dblogs
load
lslocks
lstxns
pack
recover
rmlocks
rmtxns
setlog
setrevprop
setuuid
upgrade
verify
第5章SVN鈎子實踐
5.1SVN鈎子腳本簡介
鈎子腳本的具體寫法就是操作系統中shell腳本程序的寫法,可根據自己的SVN所在的操作系統和shell程序進行相對應的開發。
鈎子腳本就是被某些版本庫事件觸發的程序,例如:創建新版本或修改未被版本控制的屬性。每個鈎子都能掌管足夠的信息來了解發生了什么事件,操作對象是什么以及觸發事件用戶的賬號。
根據鈎子的輸出或者返回狀態,鈎子程序能夠以某種方式控制該動作繼續執行,停止或者掛起。
5.2SVN的hooks模板
常見鈎子腳本
鈎子腳本 |
說明 |
post-commit |
在提交完成成功創建版本之后執行該鈎子,提交已經完成,不可更改,因此,本腳本的返回值被忽略。提交完成時觸發事物 |
pre-commit |
提交完成前觸發執行腳本 |
start-commit |
在客戶端還沒有向服務器提交數據之前,即還沒有建議txn之前,執行該腳本(提交前觸發事務) |
5.3SVN鈎子生產應用場景
pre-commit
1.閑置上傳擴展名及大小啊,控制提交要輸入的信息等。
post-commit
- SVN更新自動周知,MSN郵件或者短信周知。
- SVN更新觸發checkout程序,然后實現rsync推送到服務器等。
5.4SVN鈎子生產應用實踐
5.4.1單台svn同步web目錄
安裝web服務
yum –y instal httpd 使用yum一鍵安裝apache
service httpd start 啟動apache服務測試
配置文件修改
cd /svndata/code1/hooks/ 進入倉庫鈎子目錄
cp post-commit.tmpl post-commit 復制模版
chmod 755 post-commit 添加執行權限
> post-commit 清空配置信息
vim post-commit
#! /bin/sh
export LANG="zh_CN.UTF-8"
svn=/usr/bin/svn
$svn update /var/www/code1 --username admin --password admin
同步svn至/var/www/目錄下 (admin用戶必須對根目錄有可讀可寫)
將Apache虛擬主機指向/var/www/code1 即可訪問
關聯Web目錄
cd /var/www/
svn checkout svn://192.168.1.200/code1 checkout更新svn
首次checkout需要輸入root的密碼
其次輸入post-commit里面定義同步的用戶和密碼
用戶:admin
密碼: admin
首次需要確認是否保存密碼 輸入yes即可
5.4.2rsync與svn鈎子結合實現數據實時同步
1、建立同步WEB目錄
2、將SVN中內容checkout到WEB目錄一份
[root@svn-node1 ~]# mkdir -p /data/www #建立同步Web目錄
[root@svn-node2 ~]# svn co svn://10.0.0.7/sadoc /data/www/ --username=xuliangwei --password=xlw123 #將SVN中內容checkout到WEB目錄一份
A /data/www/linux
A /data/www/linux/centos
Checked out revision 7.
5.5SVN鈎子注意事項
1、鈎子腳本的權限要允許svn執行,一般可以設置chmod 755 post-commit
2、寫鈎子腳本時要盡可能定義環境變量,主要是需要用命令的路徑。因為SVN考慮安全問題,不會調用系統環境變量,所以如果發現手動執行post-commit沒有問題,但是SVN自動執行也可能會無法執行。
3、在SVN upate之前一定要先手動checkout一份出來,還有盡可能要加上用戶和密碼,如果只是手動一樣會更新,但自動觸發可能就不能更新了。
第6章大中小型企業上線解決方案
SVN目錄組織結構說明
branch #分支,為測試時使用,幾天以上的項目必須開分支,測試需要本分支通過,主線合並到分支通過,才能合並到主線進行測試
tags #版本記錄
trunk #主線,與正式線相對應,當天不上線文件不允許提交。