1. 程式人生 > >SVN版本管理與大型程式碼上線(9)

SVN版本管理與大型程式碼上線(9)

1,SVN服務實戰應用指南

 

1.1 SVN介紹

 

1.1.1 什麼是SVN(Subversion)?

  • Svn(subversion)是近年來崛起的非常優秀的版本管理工具,與CVS管理工具一樣,SVN是一個跨平臺的開源的版本控制系統。Svn版本管理工具管理著隨時間改變的各種資料。這些資料放置在一箇中央資料檔案庫(repository)中,這個檔案庫很像一個普通的檔案伺服器或者FTP伺服器,但是,與其他伺服器不同的是,SVN會備份並記錄每個檔案每一次的修改更新變動。這樣我們就可以把任意一個時間點的檔案恢復到想要的某一箇舊的版本,當然也可以直接瀏覽指定檔案的更新歷史記錄。
  • 為什麼會有svn這樣一個專案?
  • 官方解釋:為了接管CVS的使用者基礎,確切的說,我們寫了一個新的版本控制系統,它和CVS很相似,但是它修正了以前CVS所沒有解決的許多問題。問題見SVN官方首頁。
  • SVN是一個非常通用的軟體系統,它常被用來管理程式原始碼,但是它也可以管理任何型別的檔案,如文字,視訊,圖片等等。

SVN相關站點:

Subversion官網: 
http://subversion.tigris.org/ 
http://subversion.apache.org/ 
svn客戶端:http://toroisesvn.net/ 
svn中文網站:

http://www.iusesvn.com/ 
中文常見問題解答FAQ:http://subversion.apache.org/faq.zh.html 
官方手冊:http://svnbook.red-bean.com/ 中英都有

1.2 svn與git的區別

 

1.2.1 svn集中式版本控制系統

svn版本控制系統是集中式的資料管理,存在一箇中央版本庫,所有開發人員本地開發所使用的程式碼都是來自於這個版本庫,提交程式碼也都必須提交到這個中央版本庫。 
svn版本控制系統工作流程如下:

  1. 在中央庫上建立或從主幹複製一個分支
  2. 從中央庫check out 下這個分支的程式碼
  3. 增加自己的程式碼檔案,修改現存的程式碼或刪除程式碼檔案
  4. commit程式碼,假設有人在剛剛的分支上提交了程式碼,你就會被提示程式碼過期,你得先up你的程式碼後再提交。up程式碼的時候如果出現衝突,需要解決好衝突後再進行提交。

缺點:

當無法連線到中央版本庫的環境下,你無法提交程式碼,將程式碼加入版本控制; 
你無法檢視程式碼的歷史版本以及版本的變化過程。提交到版本控制系統中的程式碼我們都預設通過自測可執行的,如果某個模組的程式碼比較複雜,不能短時間內實現為可測試的功能,那麼你需要等很長的時間才能提交自己的程式碼,由於程式碼庫集中管理,因此,需要對中央版本庫的儲存做備份。這點分散式的版本控制系統要好一些。Svn的備份要備份所有程式碼資料以及所有更改的版本記錄。

 

1.2.2 git分散式的版本控制

  • git是由Linus開發的,所以很自然的git和Linux檔案系統結合的比較緊密,以至於在windows上你必須使用cygwin才能使其完美的工作。
  • 那git憑啥叫做分散式的版本控制系統呢?還是從其工作模式講起把。
  • 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.3 企業應用場景

svn仍是當前企業的主流。git正在發展,也許未來也會成為主流,但現在還不是。如果同學們有精力,能同時掌握更好。

 

1.4 運維人員掌握版本管理

對於版本管理系統,運維人員需要掌握的技術點:

  1. 安裝,部署,維護,排障。
  2. 簡單使用,很多公司都是由開發來管理,包括建立新倉庫和新增刪除賬號
  3. 對於版本控制系統,運維人員相當於開發商,開發人員是業主,運維搭建的系統為開發人員服務的。
 

1.5 SVN服務執行模式與訪問方式

 

1.5.1 SVN服務端執行方式

svn服務常見的執行訪問方式有3種:

(1)獨立伺服器訪問 
訪問地址如:svn://svn.yunjisuan.org/sadoc;

(2)藉助apache等http服務 
訪問地址如:http://svn.yunjisuan.com/sadoc;

a,單獨安裝apache+svn(不要用) 
b,CSVN(apache+svn)是一個單獨的整合的軟體,帶web介面管理的SVN軟體

(3)本地直接訪問(例如:file://application/svndata/sadoc) 

1.2 svn與git的區別

 

1.2.1 svn集中式版本控制系統

svn版本控制系統是集中式的資料管理,存在一箇中央版本庫,所有開發人員本地開發所使用的程式碼都是來自於這個版本庫,提交程式碼也都必須提交到這個中央版本庫。 
svn版本控制系統工作流程如下:

  1. 在中央庫上建立或從主幹複製一個分支
  2. 從中央庫check out 下這個分支的程式碼
  3. 增加自己的程式碼檔案,修改現存的程式碼或刪除程式碼檔案
  4. commit程式碼,假設有人在剛剛的分支上提交了程式碼,你就會被提示程式碼過期,你得先up你的程式碼後再提交。up程式碼的時候如果出現衝突,需要解決好衝突後再進行提交。

缺點:

當無法連線到中央版本庫的環境下,你無法提交程式碼,將程式碼加入版本控制; 
你無法檢視程式碼的歷史版本以及版本的變化過程。提交到版本控制系統中的程式碼我們都預設通過自測可執行的,如果某個模組的程式碼比較複雜,不能短時間內實現為可測試的功能,那麼你需要等很長的時間才能提交自己的程式碼,由於程式碼庫集中管理,因此,需要對中央版本庫的儲存做備份。這點分散式的版本控制系統要好一些。Svn的備份要備份所有程式碼資料以及所有更改的版本記錄。

 

1.2.2 git分散式的版本控制

  • git是由Linus開發的,所以很自然的git和Linux檔案系統結合的比較緊密,以至於在windows上你必須使用cygwin才能使其完美的工作。
  • 那git憑啥叫做分散式的版本控制系統呢?還是從其工作模式講起把。
  • 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.3 企業應用場景

svn仍是當前企業的主流。git正在發展,也許未來也會成為主流,但現在還不是。如果同學們有精力,能同時掌握更好。

 

1.4 運維人員掌握版本管理

對於版本管理系統,運維人員需要掌握的技術點:

  1. 安裝,部署,維護,排障。
  2. 簡單使用,很多公司都是由開發來管理,包括建立新倉庫和新增刪除賬號
  3. 對於版本控制系統,運維人員相當於開發商,開發人員是業主,運維搭建的系統為開發人員服務的。
 

1.5 SVN服務執行模式與訪問方式

 

1.5.1 SVN服務端執行方式

svn服務常見的執行訪問方式有3種:

(1)獨立伺服器訪問 
訪問地址如:svn://svn.yunjisuan.org/sadoc;

(2)藉助apache等http服務 
訪問地址如:http://svn.yunjisuan.com/sadoc;

a,單獨安裝apache+svn(不要用) 
b,CSVN(apache+svn)是一個單獨的整合的軟體,帶web介面管理的SVN軟體

(3)本地直接訪問(例如:file://application/svndata/sadoc) 

在這裡,主要介紹第一種方式以及第二種方式中的CSVN web管理方式

 

1.5.2 SVN客戶端訪問方式

SVN客戶端可以通過多種方式訪問伺服器端,例如:本地磁碟訪問,或各種各樣不同的網路協議訪問,但一個版本庫地址永遠都是一個URL,URL反映了訪問方法。

訪問方式 說明
file:// 直接通過本地磁碟或者網路磁碟訪問版本庫
http:// 通過WebDAV協議訪問支援Subversion的Apache伺服器
https:// 與http://相似,但是用SSL加密訪問
svn:// 通過TCP/IP自定義協議訪問svnserve伺服器
svn+ssh:// 通過認證並加密的TCP/IP自定義協議訪問svnserve伺服器
 

1.6 SVN檔案庫資料格式

svn儲存版本資料有2種方式:BDB(一種事務安全型表型別)和FSFS(一種不需要資料庫的儲存系統)。因為BDB方式在伺服器中斷時,有可能鎖住資料,所以還是FSFS方式更安全一點。

  • BDB:

    • 伯克利DB(Berkeley DB),版本庫可以使用的一種經過充分測試的後臺資料庫實現,不能在通過網路共享的檔案系統上使用,伯克利DB是Subversion 1.2版本以前的預設版本庫格式
  • FSFS:

    • 一個專用於Subversion版本庫的檔案系統後端,可以使用網路檔案系統(例如 NFS 或 SMBFS)。是1.2版本及其後的預設版本庫格式。
 

1.7.1 SVN 集中式版本管理系統

Svn是一種集中式檔案版本管理系統。集中式管理的工作流程如下圖: 
image_1cvus9p37n6r1umeu3se5mgqqm.png-43.3kB

集中式程式碼管理的核心是SVN伺服器,所有開發者在開始新一天的工作之前必須從伺服器獲取程式碼,然後進行開發,最後解決衝突,提交。所有的版本資訊都放在SVN伺服器上。因此如果脫離了伺服器,開發者就無法進行提交程式碼工作。

 

1.7.2 開發者利用SVN版本管理系統工作過程

下面舉例說明: 
開始新一天的工作:

首先從SVN伺服器下載專案組最新程式碼。 
進入自己的分支,進行開發工作,每隔一小時向伺服器上自己的分支提交一次程式碼(很多程式設計師都有這個習慣。因為有時候自己對程式碼改來改去,最後又想還原到新一個小時的版本,或者看看前一個小時自己修改了哪些程式碼,就需要這樣做了)。 
下班時間快到了,把自己的分支合併到伺服器主分支上,一天的工作完成,並反映給伺服器。

優點:

  1. 管理方便,邏輯清晰明確,符合一般人思維習慣。
  2. 易於管理,集中式svn伺服器更能保證資料安全性。
  3. 程式碼一致性非常高。
  4. 適合開發人數不多的專案開發。
  5. 普及度高,大部分軟體配置管理的大學教材都是使用svn和vss。
 

2,搭建SVN服務端

 

2.1 安裝配置SVN服務

#檢查環境
 [[email protected] ~]# cat /etc/redhat-release 
CentOS release 6.5 (Final)
[[email protected] ~]# uname -m
x86_64
[[email protected] ~]# uname -r
2.6.32-431.el6.x86_64
#光碟安裝svn
[[email protected] ~]# yum -y install subversion
[[email protected] ~]# rpm -qa subversion
subversion-1.6.11-9.el6_4.x86_64
#建立svn版本庫資料儲存根目錄(svndata)及使用者,密碼許可權目錄(svnpasswd)
mkdir -p /application/svndata   #資料儲存根目錄
mkdir -p /application/svnpasswd #使用者,密碼許可權目錄

2.2 建立專案版本庫

建立一個新的Subversion專案yunjisuan,其實,類似yunjisuan這樣的專案可以建立多個,每個專案對應不同的程式碼,這裡只是以建立一個專案為例演示:

[[email protected] ~]# svnadmin create /application/svndata/yunjisuan
[[email protected] ~]# tree /application/svndata/yunjisuan/
/application/svndata/yunjisuan/
|-- README.txt
|-- conf
|   |-- authz
|   |-- passwd
|   `-- svnserve.conf
|-- db
|   |-- current
|   |-- format
|   |-- fs-type
|   |-- fsfs.conf
|   |-- min-unpacked-rev
|   |-- rep-cache.db
|   |-- revprops
|   |   `-- 0
|   |       `-- 0
|   |-- revs
|   |   `-- 0
|   |       `-- 0
|   |-- transactions
|   |-- txn-current
|   |-- txn-current-lock
|   |-- txn-protorevs
|   |-- uuid
|   `-- write-lock
|-- format
|-- hooks
|   |-- post-commit.tmpl
|   |-- post-lock.tmpl
|   |-- post-revprop-change.tmpl
|   |-- post-unlock.tmpl
|   |-- pre-commit.tmpl
|   |-- pre-lock.tmpl
|   |-- pre-revprop-change.tmpl
|   |-- pre-unlock.tmpl
|   `-- start-commit.tmpl
`-- locks
    |-- db-logs.lock
    `-- db.lock
10 directories, 28 files
#提示:檢視svnadmin命令幫助的方法

2.3 編輯svn配置檔案

[[email protected] ~]# cd /application/svndata/yunjisuan/conf/
[[email protected] conf]# ll
total 12
-rw-r--r--. 1 root root 1080 Sep 13 16:02 authz
-rw-r--r--. 1 root root  309 Sep 13 16:02 passwd
-rw-r--r--. 1 root root 2279 Sep 13 16:02 svnserve.conf
[[email protected] conf]# cp svnserve.conf{,.bak}
[[email protected] conf]# vim svnserve.conf
#修改配置檔案的如下資訊
[[email protected] ~]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf.bak | sed -n '12p;13p;20p;27p'
    12  # anon-access = read
    13  # auth-access = write
    20  # password-db = passwd
    27  # authz-db = authz
#將配置檔案程式碼修改為如下所示:
[[email protected] ~]# cat -n /application/svndata/yunjisuan/conf/svnserve.conf | sed -n '12p;13p;20p;27p'
    12  anon-access = none          #禁止匿名訪問
    13  auth-access = write         #驗證訪問可寫
    20  password-db = /application/svnpasswd/passwd #密碼檔案位置
    27  authz-db = /application/svnpasswd/authz     #驗證檔案位置
特別提示:
此配置檔案裡的每條配置程式碼必須頂格寫,不能有空格。

2.4 將authz檔案和passwd檔案拷貝到/application/svnpasswd下

[[email protected] conf]# cp /application/svndata/yunjisuan/conf/authz /application/svnpasswd/
[[email protected] conf]# cp /application/svndata/yunjisuan/conf/passwd /application/svnpasswd/
[[email protected] conf]# ll /application/svnpasswd/
total 8
-rw-r--r--. 1 root root 1080 Sep 13 17:07 authz
-rw-r--r--. 1 root root  309 Sep 13 17:07 passwd

2.5 啟動svn服務

[[email protected] conf]# svnserve --help          #svn啟動命令幫助
svnserve: warning: cannot set LC_CTYPE locale
svnserve: warning: environment variable LANG is en
svnserve: warning: please check that your locale name is correct
usage: svnserve [-d | -i | -t | -X] [options]
Valid options:
  -d [--daemon]            : daemon mode        #守護程序啟動(後臺)
  -i [--inetd]             : inetd mode
  -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        #監聽埠預設3690
                             [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
                             [mode: daemon, listen-once]
  --tunnel-user ARG        : tunnel username (default is current uids name)
                             [mode: tunnel]
  -h [--help]              : display this help
  --version                : show program version information
#啟動svn服務
[[email protected] conf]# svnserve -d -r /application/svndata/
svnserve: warning: cannot set LC_CTYPE locale   #警告可以忽略
svnserve: warning: environment variable LANG is en #警告可以忽略
svnserve: warning: please check that your locale name is correct    ##警告可以忽略
[[email protected] conf]# netstat -antup | grep 3690
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      1256/svnserve    

 

2.6 解決svnserve啟動時的警告問題

[[email protected] conf]# source /etc/sysconfig/i18n   #啟用中文字符集
[[email protected] conf]# pkill svnserve
[[email protected] conf]# svnserve -d -r /application/svndata/
[[email protected] conf]# netstat -antup | grep 3690
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      1261/svnserve 
[[email protected] conf]# cat /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

2.7 passwd檔案及密碼設定

#在/application/svnpasswd/passwd檔案末尾追加如下內容:
[[email protected] conf]# tail -4 /application/svnpasswd/passwd 
yunjisuan = 111111      #設定賬號密碼
benet     = 111111      #設定賬號密碼
stu001    = 123         #設定賬號密碼
stu002    = 456         #設定賬號密碼

2.8 authz的授權

注意: 
1,許可權配置檔案中出現的使用者名稱必須已在使用者配置檔案中定義 
2,對許可權配置檔案的修改立即生效,不必重啟svn

許可權配置說明
#使用者組格式:
【groups】
=,
其中,1個使用者組可以包含1個或多個用過戶,使用者間以逗號分隔。
例如:harry\_and\_sally = harry,sally     #==>使用者組 = 使用者1,使用者2
#版本庫目錄格式:
[<版本庫>:/專案/目錄]  #例如:[repository:/baz/fuz]
@<使用者組名> = <許可權>    #例如:@harry\_and\_sally = rw
<使用者名稱> = <許可權>       #例如:harry = rw
#其中,方框號內部分可以有多種寫法:
[/],表示根目錄及以下,根目錄是svnserve啟動時指定的,我們指定為/application/svndata,[/]就是表示對全部版本庫設定許可權。
[repos:/],表示對版本庫repos設定許可權。
[repos:/yunjisuan],表示對版本庫repos中的yunjisuan專案設定許可權。
[repos:/yunjisuan/benet],表示對版本庫repos中的yunjisuan專案的benet目錄設定許可權。
#許可權主體可以是使用者組,使用者或*,使用者組在前面加@,*表示全部使用者。
#許可權可以是w,r,wr和空,空表示沒有任何許可權。
#authz中每個引數都要頂格寫,開頭不能有空格。
#對於組,要以@開頭,使用者不需要@開頭。
#編輯authz配置檔案進行授權,在authz末尾加入以下幾句程式碼
[[email protected] conf]# egrep -v "#|^$" /application/svnpasswd/authz
[aliases]
[groups]
sagroup = stu001,stu002         #新增本行,定義組名
[yunjisuan:/]                   #定義授權的範圍
yunjisuan = rw                  #使用者單獨授權
benet = r                       #使用者單獨授權
@sagroup = r                    #組使用者授權

2.9 重啟動svnserve

[[email protected] conf]# ps -ef | grep svn | grep -v grep
root       1261      1  0 17:16 ?        00:00:00 svnserve -d -r /application/svndata/
[[email protected] conf]# kill 1261
[[email protected] conf]# ps -ef | grep svn | grep -v grep
[[email protected] conf]# svnserve -d -r /application/svndata/

3,搭建SVN客戶端

 

3.1 使用svn客戶端(windows版)

 

3.1.1 軟體版本選擇

推薦:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7

注意:32位系統要用32位軟體版本

 

3.1.2 svn客戶端軟體安裝

一路yes即可

 

3.1.3 svn客戶端軟體的使用

(1)先在本地建立一個目錄,起名任意,比如data 
image_1cvust6me1tmnhkoa9pnvaff313.png-18.4kB

(2)滑鼠右鍵點選data目錄

選擇右鍵選單裡的SVN Checkout,出現下圖: 
image_1cvvc1f5n1a41v151fe61t3hq9g2n.png-28kB

特別提示: 
如果連線不通,請檢查Linux虛擬機器的iptables是否關閉。

點選OK後,出現下圖: 
image_1cvusu8rh1asl1k1slra1h6lc001t.png-35.8kB

再次點選OK以後,結束。此時目錄裡多了一個隱藏的目錄,表示此目錄已經和svn伺服器連通 
image_1cvvc3dmp1plr1brri2jf2v1vln34.png-52.1kB

命令說明: 
(1)SVN Checkout:相當於下載,第一次連線svn伺服器的時候需要和伺服器的對應儲存目錄進行資料同步,如果伺服器的對應目錄裡有資料檔案,那麼就會下載到你的本地對應目錄裡。 
(2)SVN Update:更新資料,檢查伺服器端svn儲存目錄裡是否和本地svn儲存目錄資料不一致,如果不一致,那麼下載改變或新增的部分到本地svn目錄裡。(不會刪除本地目錄內容) 
(3)SVN Commit:提交資料到svn伺服器端儲存目錄。本地svn儲存目錄會和伺服器端儲存目錄進行比對校驗。會把本地改變的部分和新增的部分同步上傳至伺服器端。

 

3.1.4 svn客戶端使用測試

(1)向windows的svn儲存目錄data裡放一個空檔案 
image_1cvvc61j0kqsjmtpv4m0o11n53h.png-10.1kB

(2)右鍵點選data目錄,選擇SVN Commit 
image_1cvvc8d41pr9mafn6i1b9r1sag4b.png-50.3kB 
image_1cvvc9om4eq61o42mkn1eoj1ss34o.png-35.5kB

(3)開啟本地data目錄裡的檔案,隨便寫點內容後,再次進行SVN commit 
image_1cvvcdtkq185b6lk1ncc10bv1ofi55.png-50.3kB 
image_1cvvcedok15rm1defa8b1llu12qr5i.png-34.9kB

(4)直接從本地檢視伺服器端的資料內容 
右鍵點選本地svn儲存目錄data,選擇TortoiseSVN ===>Repo-browser後出現下圖: 
image_1cvvckjsh1hef1a6e4nf1ap281v5v.png-53.7kB 
雙擊檔案可以直接遠端開啟檔案,可以看到裡面剛剛被修改後的內容已經更新至伺服器端。

(5)刪除本地svn儲存目錄data裡的檔案,後選擇SVN Update

會發現,剛剛刪除的檔案又重新下載回來了。

(6)繼續刪除本地svn儲存目錄data裡的檔案,後選擇SVN Commit 
image_1cvvcqjv23lo1f5gvgpvolutn6c.png-51.8kB 
image_1cvvcr2mnoam1o6m10991sro1ls56p.png-32kB

(7)再次檢視伺服器端儲存目錄裡,發現檔案已經被刪除了 
image_1cvvcrsahavk1vsl1okb180a1fku76.png-47.3kB

 

3.2 SVN的管理命令(Linux)

[[email protected] ~]# svn --help
usage: svn <subcommand> [options] [args]
Subversion command-line client, version 1.6.11.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules
  or 'svn --version --quiet' to see just the version number.
Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.
Available subcommands:
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)        #下載資料
   cleanup
   commit (ci)          #提交資料
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)            #顯示伺服器端內容
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)                  #更新資料
Subversion is a tool for version control.
For additional information, see http://subversion.tigris.org/

3.2.1 從SVN庫提取資料

[[email protected] ~]# mkdir yunjisuan
[[email protected] ~]# cd yunjisuan/
[[email protected] yunjisuan]# pwd
/root/yunjisuan
#下載伺服器端資料到Linux本地目錄
[[email protected] yunjisuan]# svn co svn://192.168.0.220/yunjisuan/ /root/yunjisuan/ --username=benet --password=123123
Restored '/root/yunjisuan/ffff.txt'
Checked out revision 6.
[[email protected] yunjisuan]# ll
total 4
-rw-r--r--. 1 root root 30 Sep 13 19:45 ffff.txt

3.2.2 檢視SVN版本庫中的資料

[[email protected] yunjisuan]# svn list file:///application/svndata/yunjisuan/
ffff.txt

3.2.3 提交資料到SVN版本庫

(1)一次失敗的提交

[[email protected] yunjisuan]# pwd
/root/yunjisuan
[[email protected] yunjisuan]# touch {10..15}  #建立目錄
[[email protected] yunjisuan]# ll
total 0
-rw-r--r--. 1 root root 0 Dec 31 03:14 10
-rw-r--r--. 1 root root 0 Dec 31 03:14 11
-rw-r--r--. 1 root root 0 Dec 31 03:14 12
-rw-r--r--. 1 root root 0 Dec 31 03:14 13
-rw-r--r--. 1 root root 0 Dec 31 03:14 14
-rw-r--r--. 1 root root 0 Dec 31 03:14 15
[[email protected] yunjisuan]# svn add *   #提交前需要先把要提交的內容做標記A
A         10
A         11
A         12
A         13
A         14
A         15
[[email protected] yunjisuan]# svn ci -m "message"
svn: Commit failed (details follow):
svn: Authorization failed           #提交失敗許可權不通過

(2)換賬戶重新Checkout

[[email protected] yunjisuan]# svn co svn://192.168.200.131/yunjisuan/ /root/yunjisuan/ --username=yunjisuan --password=111111  #換擁有寫入許可權的賬戶checkout
-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:
   <svn://192.168.200.131:3690> 0d8e0c35-eabc-4e9f-b05d-86010b9f1c5b
can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.
You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes    #是否作為目錄的新賬戶和密碼
Checked out revision 3.
[[email protected] yunjisuan]# ll
total 0
-rw-r--r--. 1 root root 0 Dec 31 03:14 10
-rw-r--r--. 1 root root 0 Dec 31 03:14 11
-rw-r--r--. 1 root root 0 Dec 31 03:14 12
-rw-r--r--. 1 root root 0 Dec 31 03:14 13
-rw-r--r--. 1 root root 0 Dec 31 03:14 14
-rw-r--r--. 1 root root 0 Dec 31 03:14 15
#重新提交
[[email protected] yunjisuan]# svn add *   #檔案或目錄已經納入了版本控制(前面已經做過標記)
svn: warning: '10' is already under version control
svn: warning: '11' is already under version control
svn: warning: '12' is already under version control
svn: warning: '13' is already under version control
svn: warning: '14' is already under version control
svn: warning: '15' is already under version control
[[email protected] yunjisuan]# svn ci -m "message" #重新提交
Adding         10
Adding         11
Adding         12
Adding         13
Adding         14
Adding         15
Transmitting file data ......
Committed revision 4.
#檢視伺服器端資料
[[email protected] yunjisuan]# svn list file:///application/svndata/yunjisuan/
10
11
12
13
14
15

4,SVN鉤子指令碼

 

4.1 鉤子指令碼簡介

  • 鉤子指令碼的具體寫法就是作業系統中shell指令碼程式的寫法,可根據自己的SVN所在的作業系統和shell程式進行相應的開發。
  • 鉤子指令碼就是被某些版本庫事件觸發的程式,例如:建立新版本或修改未被版本控制的屬性。每個鉤子都能掌管足夠的資訊來了解發生了什麼事件,操作物件是什麼以及觸發事件使用者的賬號。
  • 根據鉤子的輸出或返回狀態,鉤子程式能夠以某種方式控制該動作繼續執行,停止或掛起。

預設情況下,鉤子的子目錄中包含各種版本庫鉤子模板

[[email protected] ~]# ls -l /application/svndata/yunjisuan/hooks/
total 36
-rw-r--r--. 1 root root 1977 Sep 13 16:02 post-commit.tmpl
-rw-r--r--. 1 root root 1638 Sep 13 16:02 post-lock.tmpl
-rw-r--r--. 1 root root 2289 Sep 13 16:02 post-revprop-change.tmpl
-rw-r--r--. 1 root root 1567 Sep 13 16:02 post-unlock.tmpl
-rw-r--r--. 1 root root 3426 Sep 13 16:02 pre-commit.tmpl
-rw-r--r--. 1 root root 2410 Sep 13 16:02 pre-lock.tmpl
-rw-r--r--. 1 root root 2786 Sep 13 16:02 pre-revprop-change.tmpl
-rw-r--r--. 1 root root 2100 Sep 13 16:02 pre-unlock.tmpl
-rw-r--r--. 1 root root 2780 Sep 13 16:02 start-commit.tmpl
  • 對每種Subversion版本庫支援的鉤子都有一個模板,通過檢視這些指令碼的內容,你能看到是什麼事件觸發了指令碼及如何給傳指令碼傳遞資料。
  • 同時,這些模板也是如何使用這些指令碼,結合Subversion支援的工具來完成有用任務的例子。
  • 要實際安裝一個可用的鉤子,你需要在repos/hooks目錄下安裝一些與鉤子同名(如start-commit或者post-commit)的可執行程式或指令碼,注意,去掉模板的副檔名。

重要提示:

由於安全原因,Subversion版本庫在一個空環境中執行鉤子指令碼就是沒有任何環境變數,甚至沒有$PATH或%PATH%。由於這個原因,許多管理員會感到很困惑,他們的鉤子指令碼手工執行時正常,可在Subversion中卻不能執行。要注意,必須在你的鉤子中設定好環境變數或為你的程式指定好絕對路徑。

 

4.2 SVN的hooks模板

 

4.2.1 常用鉤子指令碼

鉤子指令碼 說明
post-commit 在提交完成成功建立版本之後執行該鉤子,提交已經完成,不可更改,因此,本指令碼的返回值被忽略。提交完成時觸發事務
pre-commit 提交完成前觸發執行該指令碼
start-commit 在客戶端還沒有向伺服器提交資料之前,即還沒有建立Subversion transaction之前,執行該指令碼(提交前出發事務)

4.2.2 非常用鉤子指令碼

  1. pre-revprop-change:在修改revision屬性之前,執行該指令碼
  2. post-revprop-change:在修改revision屬性之後,執行該指令碼。因為修改稿已經完成,不可更改,因此本指令碼的返回值被忽略(不過實際上的實現似乎是該指令碼的正確執行與否影響屬性修改)
  3. pre-unlock:對檔案進行解鎖操作之前執行該指令碼
  4. post-unlock:對檔案進行解鎖操作之後執行該指令碼
  5. pre-lock:對檔案進行加鎖操作之前執行該指令碼
  6. post-lock:對檔案進行加鎖操作之後執行該指令碼。
 

4.2.3 利用鉤子指令碼觸發同步資料的注意事項

(1)一定要定義變數,主要是用過的命令的路徑。因為SVN的考慮的安全問題,沒有呼叫系統變數,如果手動執行是沒有問題,但SVN自動執行就會無法執行了。 
(2)SVN的同步目錄在 update之前一定要先checkout一份出來,還有這裡一定要新增使用者和密碼。 
(3)加上了對前一個命令的判斷,如果update的時候出了問題,程式沒有退出的話還會繼續同步程式碼到Web伺服器上,這樣會造成程式碼有問題。 
(4)建議最好記錄日誌,出錯的時候可以很快的排錯 
(5)最後是資料同步,rsync的相關引數一定要清楚。

 

4.3 svn鉤子生產應用場景舉例

  • pre-commit:

    • 限制上傳副檔名及大小,控制提交要輸入的資訊等。
  • post-commit:

    • SVN更新自動周知,MSN,郵件或簡訊周知。
    • SVN更新觸發checkout程式,然後實時rsync推送到伺服器等。
 

4.4 svn鉤子生產應用實戰

 

4.4.1 rsync與svn鉤子結合實現資料實時同步某企業小案例

(1)建立同步WEB目錄

mkdir -p /data/www

(2)將SVN中內容checkout到WEB目錄一份。

[[email protected] yunjisuan]# mkdir -p /data/www
[[email protected] yunjisuan]# svn checkout svn://192.168.0.220/yunjisuan /data/www --username=yunjisuan --password=123123
A    /data/www/xxxx
A    /data/www/111
A    /data/www/120
A    /data/www/112
A    /data/www/113
A    /data/www/114
A    /data/www/ffff.txt
A    /data/www/115
A    /data/www/116
A    /data/www/117
A    /data/www/118
A    /data/www/119
Checked out revision 7.
[[email protected] yunjisuan]# ll /data/www/
total 44
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 111
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 112
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 113
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 114
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 115
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 116
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 117
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 118
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 119
drwxr-xr-x. 3 root root 4096 Sep 13 21:32 120
-rw-r--r--. 1 root root   30 Sep 13 21:32 ffff.txt
-rw-r--r--. 1 root root    0 Sep 13 21:32 xxxx

(3)製作鉤子指令碼,post-commit

[email protected] yunjisuan]# cd /application/svndata/yunjisuan/hooks/
[[email protected] hooks]# cp post-commit.tmpl post-commit #複製模板一份
[[email protected] hooks]# egrep -v "#|^$" post-commit     #模板原始內容
REPOS="$1"
REV="$2"
mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
[[email protected] hooks]# vim post-commit         #修改post-commit指令碼
[[email protected] hooks]# egrep -v "#|^$" post-commit
REPOS="$1"                  #傳參(未用上)
REV="$2"                    #傳參(未用上)
SvnIP="192.168.0.220"       #svn服務端的IP地址
ProjectName="yunjisuan"     #svn服務端的專案庫名稱
UserName="yunjisuan"        #賬戶姓名
PassWord="123123"           #賬戶密碼
LocalPath="/data/www"       #位於svn本地的共享目錄
SVN=/usr/bin/svn            #svn命令的絕對路徑
export LC_CTYPE="en_US.UTF-8"   #中文字符集支援
export LC_ALL=
if [ ! -d ${LocalPath} ];then   
    mkdir -p ${LocalPaht}
    $SVN checkout svn://${SvnIP}/${ProjectName} ${LocalPath} --username=${UserName} --password=${PassWord}       #新建立目錄需要先經過checkout才能update
else
    $SVN update --username yunjisuan --password 123123 /data/www        #更新共享目錄內容
fi
if [ $? -eq 0 ];then
    /usr/bin/rsync -az --delete /data/www /tmp/         #資料同步推送到本地/tmp目錄下(生產環境可以直接同步推送到Web測試伺服器)
fi

4)進行鉤子指令碼同步測試

#刪除之前的測試記錄
[