1. 程式人生 > >SVN版本管理

SVN版本管理

一、搭建SVN服務端

1、安裝配置SVN服務 
光碟安裝svn yum -y install subversion 
image_1ct2j03pf1dvc1c1t1o9s19lh12jj13.png-7.7kB

image_1ct2j77f6192c1lvplku1rds1r891g.png-24.2kB

2、建立專案版本庫

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

image_1ct2le47akt5g6v1s6k1iqum552d.png-35.3kB

3、編輯svn配置檔案 
備份配置檔案 cp svnserve.conf{,.bak} 
修改配置檔案:vim svnserve.conf 
image_1ct2locck1c2u1lj9jghr2b7tk2q.png-62.9kB

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

 
[[email protected]kins conf]# cp /application/svndata/yunjisuan/conf/authz /application/svnpasswd/
[[email protected] conf]# cp /application/svndata/yunjisuan/conf/passwd /application/svnpasswd/

 

5、啟動svn服務---svnserve -d -r /application/svndata/ 
svn啟動命令幫助 svnserve --help

image_1ct2m3b6cci31rdo1iah1q1jddq37.png-67.7kB

image_1ct2m4uqq4e21beh1mlfhrh1l5n3k.png-17.7kB

source /etc/sysconfig/i18n --->啟用中文字符集 
image_1ct2m8fk7c9t1oe41rhg1v9911cj41.png-8.4kB

6、passwd檔案及密碼設定 
image_1ct2mcdf5k2e1msf1jfmhk91vc74e.png-13.5kB

7、authz的授權

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

 
  1. 許可權配置說明
  2. #使用者組格式:
  3. groups
  4. =,
  5. 其中,1個使用者組可以包含1個或多個用過戶,使用者間以逗號分隔。
  6. 例如:harry\_and\_sally = harry,sally #==>使用者組 = 使用者1,使用者2
  7. #版本庫目錄格式:
  8. [<版本庫>:/專案/目錄] #例如:[repository:/baz/fuz]
  9. @<使用者組名> = <許可權> #例如:@harry\_and\_sally = rw
  10. <使用者名稱> = <許可權> #例如:harry = rw
  11. #其中,方框號內部分可以有多種寫法:
  12. [/],表示根目錄及以下,根目錄是svnserve啟動時指定的,我們指定為/application/svndata,[/]就是表示對全部版本庫設定許可權。
  13. [repos:/],表示對版本庫repos設定許可權。
  14. [repos:/yunjisuan],表示對版本庫repos中的yunjisuan專案設定許可權。
  15. [repos:/yunjisuan/benet],表示對版本庫repos中的yunjisuan專案的benet目錄設定許可權。
  16. #許可權主體可以是使用者組,使用者或*,使用者組在前面加@,*表示全部使用者。
  17. #許可權可以是w,r,wr和空,空表示沒有任何許可權。
  18. #authz中每個引數都要頂格寫,開頭不能有空格。
  19. #對於組,要以@開頭,使用者不需要@開頭。

編輯authz配置檔案進行授權,在authz末尾加入以下幾句程式碼 
image_1ct2sld4v7ed1ab1k3cnia1u929.png-28.9kB

 

二、搭建SVN客戶端

1 使用svn客戶端(windows版) 
(1) 軟體版本選擇 
推薦:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7

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

參考連結,自行解壓安裝 
連結:https://pan.baidu.com/s/1Ow6MXOuQyMZnVp9ytH6NwQ 
提取碼:33o9

(2)svn客戶端軟體安裝 
一路yes即可

(3)svn客戶端軟體的使用 
先在本地建立一個目錄,起名任意,比如data

image_1ct2t31uj11f5dh91pn14021b30m.png-18.4kB

滑鼠右鍵點選data目錄

選擇右鍵選單裡的SVN Checkout,出現下圖:

image_1ct2t5s2rqp31hso1dpm1uka1n1023.png-26.4kB

如果連線不通,檢查Linux虛擬機器的iptables是否關閉。

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

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

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

2、svn客戶端使用測試 
(1)向windows的svn儲存目錄data裡放一個空檔案

image_1ct2thqein3q10si1l4q1o6c16h53q.png-11.8kB

(2)右鍵點選data目錄,選擇SVN Commit 
image_1ct2tltipvp98a614og16g6gbm4k.png-51.8kB

image_1ct2tnsev17um10a4jph144urdd61.png-38kB

(3)開啟本地data目錄裡的檔案,隨便寫點內容後,再次進行SVN commit

image_1ct2tqqbo1qlo173h19cfq3r1umj6e.png-54.7kB

image_1ct2trdg1lr13nq4kqgc21dnp6r.png-34.2kB

(4)直接從本地檢視伺服器端的資料內容 
右鍵點選本地svn儲存目錄data,選擇TortoiseSVN ===>Repo-browser後出現下圖:

image_1ct2u5ep77vh1p6c83h5c0hfc7o.png-57kB 
雙擊檔案可以直接遠端開啟檔案,可以看到裡面剛剛被修改後的內容已經更新至伺服器端。

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

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

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

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

image_1ct2ua5ko28ucr8129i1bcv103t9f.png-37.5kB

3、SVN的管理命令(Linux)

 
 1 [[email protected] /]# svn --help
 2 usage: svn <subcommand> [options] [args]
 3 Subversion command-line client, version 1.6.11.
 4 Type 'svn help <subcommand>' for help on a specific subcommand.
 5 Type 'svn --version' to see the program version and RA modules
 6 or 'svn --version --quiet' to see just the version number.
 7 Most subcommands take file and/or directory arguments, recursing
 8 on the directories. If no arguments are supplied to such a
 9 command, it recurses on the current directory (inclusive) by default.
10 Available subcommands:
11 add
12 blame (praise, annotate, ann)
13 cat
14 changelist (cl)
15 checkout (co) #下載資料
16 cleanup
17 commit (ci) #提交資料
18 copy (cp)
19 delete (del, remove, rm)
20 diff (di)
21 export
22 help (?, h)
23 import
24 info
25 list (ls) #顯示伺服器端內容
26 lock
27 log
28 merge
29 mergeinfo
30 mkdir
31 move (mv, rename, ren)
32 propdel (pdel, pd)
33 propedit (pedit, pe)
34 propget (pget, pg)
35 proplist (plist, pl)
36 propset (pset, ps)
37 resolve
38 resolved
39 revert
40 status (stat, st)
41 switch (sw)
42 unlock
43 update (up) #更新資料
44 Subversion is a tool for version control.
45 For additional information, see http://subversion.tigris.org/

 

(1)\從SVN庫提取資料

將檔案checkout到本地目錄 svn checkout(co) remotepath localpath

image_1ct2v1ens4ke1ku81urn5ujcuo9s.png-20.8kB

 
  1. #下載伺服器端資料到Linux本地目錄
  2. [[email protected] yunjisuan]# svn co svn://192.168.200.128/yunjisuan/ /root/yunjisuan/ --username=benet --password=123123

image_1ct2v5crnrohtg219ensq6812a9.png-14.1kB

(2)\檢視SVN版本庫中的資料

svn list file:///application/svndata/yunjisuan

image_1ct2v8eiu1bno9bm136mm5goivam.png-9.3kB

(3)\提交資料到SVN版本庫 
以下是一次失敗的提交 
image_1ct2vtrp61qujriv1rh1tkbcptb3.png-41.8kB

換賬戶重新Checkout 
image_1ct3057o0aulgvvh0fqp71hrqbg.png-55.5kB

image_1ct30c8dh136v1fumnp319ugmvqbt.png-38.9kB

image_1ct30fjef1kess2210go159i1qq5ca.png-46kB

 

三、SVN鉤子指令碼

1 、鉤子指令碼簡介

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

預設情況下,鉤子的子目錄中包含各種版本庫鉤子模板 
image_1ct30nogr11r9qe61f2khsvt12cn.png-36.6kB

1、對每種Subversion版本庫支援的鉤子都有一個模板,通過檢視這些指令碼的內容,你能看到是什麼事件觸發了指令碼及如何給傳指令碼傳遞資料。 
2、同時,這些模板也是如何使用這些指令碼,結合Subversion支援的工具來完成有用任務的例子。 
3、要實際安裝一個可用的鉤子,你需要在repos/hooks目錄下安裝一些與鉤子同名(如start-commit或者post-commit)的可執行程式或指令碼,注意,去掉模板的副檔名。

重要提示:

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

2、SVN的hooks模板 
(1)常用鉤子指令碼 
image_1ct30qqepf971uam1vhj1dnf108fd4.png-29.9kB 
(2)常用鉤子指令碼

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

(3)利用鉤子指令碼觸發同步資料的注意事項 
(1)一定要定義變數,主要是用過的命令的路徑。因為SVN的考慮的安全問題,沒有呼叫系統變數,如果手動執行是沒有問題,但SVN自動執行就會無法執行了。

(2)SVN的同步目錄在 update之前一定要先checkout一份出來,還有這裡一定要新增使用者和密碼。

(3)加上了對前一個命令的判斷,如果update的時候出了問題,程式沒有退出的話還會繼續同步程式碼到Web伺服器上,這樣會造成程式碼有問題。

(4)建議最好記錄日誌,出錯的時候可以很快的排錯

(5)最後是資料同步,rsync的相關引數一定要清楚。

3、svn鉤子生產應用場景舉例

pre-commit:

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

post-commit:

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

4、svn鉤子生產應用實戰 
(1)、 rsync與svn鉤子結合實現資料實時同步某企業小案例 
建立同步WEB目錄mkdir -p /data/www 
(2)、將SVN中內容checkout到WEB目錄一份。

 
 1 [[email protected] ~]# svn checkout svn://192.168.200.128/yunjisuan /data/www/ --username=yunjisuan --password=123123
 2 A /data/www/111
 3 A /data/www/120
 4 A /data/www/112
 5 A /data/www/113
 6 A /data/www/114
 7 A /data/www/115
 8 A /data/www/116
 9 A /data/www/117
10 A /data/www/118
11 A /data/www/119
12 A /data/www/aaa.txt.txt
13 Checked out revision 6.
14 [[email protected] ~]# ll /data/www/
15 total 44
16 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 111
17 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 112
18 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 113
19 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 114
20 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 115
21 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 116
22 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 117
23 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 118
24 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 119
25 drwxr-xr-x. 3 root root 4096 Nov 25 06:15 120
26 -rw-r--r--. 1 root root 7 Nov 25 06:15 aaa.txt.txt

 

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

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

 

(4)進行鉤子指令碼同步測試 
刪除之前的測試記錄 
rm -rf /data/www/ 
chmod 700 post-commit 給鉤子指令碼可執行許可權

特別提示: 當用戶通過svn更新鉤子post-commit所在的專案庫時,在更新完畢之後會自動觸發鉤子指令碼

模擬更新專案庫版本 
image_1ct34grms1dbq1a2112i813t71k1qdu.png-46.1kB

image_1ct34hafbgrt1abe1sukch16dheb.png-37.7kB

image_1ct34i7ed1n6oaigip1181vs1bf8.png-97.7kB