SVN版本控制系統最佳實踐


第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

  1. SVN更新自動周知,MSN郵件或者短信周知。
  2. 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 #主線,與正式線相對應,當天不上線文件不允許提交。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM