SVN版本管理與大型代碼上線html
1、SVN簡介web
SVN是近年來崛起的很是優秀的版本管理工具,是一個開源的版本控制系統,開發的代碼版本,
這些數據位置放置在一箇中央資料檔案庫,很想一個普通的文件服務器或者FTP服務器
與其餘服務器不用的是,SVN會備份並記錄每一個文件每一次的修改更新變更,
能夠進行回滾操做,能夠把任意一個時間點的檔案恢復到想要的某一箇舊的版本,
也能夠瀏覽指定文件的更新歷史記錄。shellSVN是一個很是通用的軟件系統,它常被用來管理程序源碼,可是它也能夠管理任何類型的文件,
如文本,視頻,圖片等等apache
SVN相關站點vim
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/ 中英都有windows
SVN與Git的區別服務器
集中代碼版本管理工具——SVN,應用產品開發,可讓每一個人協調,開發用的多
我的代碼版本管理工具——Git,只針對我的,與其餘人沒法配合app
企業應用場景運維
SVN還是當前企業的主流,Git正在發展,也許將來也會成爲主流,小企業用的多svn
運維人員掌握版本管理
一、安裝,部署,維護,排障
二、簡單使用,不少公司都是由開發來管理,包括創建新倉庫和添加刪除帳號
三、對於版本控制系統,運維人員至關於開發商,開發人員是業主,運維搭建的系統爲開發人員服務
SVN三種訪問方式
(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)
2、搭建SVN服務端
安裝配置SVN服務
#光盤安裝svn [root@localhost ~]# yum -y install subversion [root@localhost ~]# rpm -qa subversion subversion-1.6.11-9.el6_4.x86_64 #創建svn版本庫數據存儲根目錄(svndata)及用戶,密碼權限目錄(svnpasswd) mkdir -p /application/svndata #數據存儲根目錄 mkdir -p /application/svnpasswd #用戶,密碼權限目錄
創建項目版本倉庫
建立一個新的subversion項目yunjisuan,其實相似yunjisuan這樣的項目能夠建立多個,
每一個項目對應不一樣的代碼。這裏只建立一個項目爲例:
svnadmin create /application/svndata/yunjisuan tree /application/svndata/yunjisuan/
編輯SVN配置文件
cd /application/svndata/yunjisuan/conf/ cp svnserve.conf{,.bak} vim svnserve.conf #修改十二、13、20、27行內容 12 anon-access = none #禁止匿名訪問 13 auth-access = write #驗證訪問可寫 20 password-db = /application/svnpasswd/passwd #密碼文件位置 27 authz-db = /application/svnpasswd/authz #驗證文件位置
將authz文件和passwd文件拷貝到/application/svnpasswd下
cp /application/svndata/yunjisuan/conf/authz /application/svnpasswd/ cp /application/svndata/yunjisuan/conf/passwd /application/svnpasswd/
啓動SVN
[root@localhost 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 [root@localhost conf]# svnserve -d -r /application/svndata/ #警告能夠忽略 [root@localhost conf]# netstat -antup | grep 3690 #svn默認3690端口
解決svnserve啓動時的警告問題
[root@localhost conf]# source /etc/sysconfig/i18n #啓用中文字符集 [root@localhost conf]# pkill svnserve [root@localhost conf]# svnserve -d -r /application/svndata/ [root@localhost conf]# netstat -antup | grep 3690
passwd文件及密碼設置
#在/application/svnpasswd/passwd文件末尾追加以下內容: [root@localhost conf]# tail -4 /application/svnpasswd/passwd yunjisuan = 123123 #設置帳號密碼 benet = 123123 #設置帳號密碼 stu001 = 123 #設置帳號密碼 stu oo2 = 456 #設置帳號密碼
authz受權
注意:
一、權限配置文件中出現的用戶名必須已在用戶配置文件中定義(必須有這個用戶才行)
二、對權限配置文件的修改當即生效,沒必要重啓svn
權限配置說明
[groups] zuming = xiaoming,xiaohong #用戶組名 = 用戶1,用戶2 #版本庫目錄格式: [repository:/baz/fuz] #[<版本庫>:/項目/目錄] @zuming = rw #<用戶組名> = <權限> xiaoming = rw #<用戶名> = <權限>
#編輯authz配置文件進行受權,在authz末尾加入如下幾句代碼 [root@localhost conf]# egrep -v "#|^$" /application/svnpasswd/authz [aliases] [groups] sagroup = stu001,stu002 #新增本行,定義組名 [yunjisuan:/] #定義受權的範圍 yunjisuan = rw #用戶單獨受權 benet = r #用戶單獨受權 @sagroup = r #組用戶受權
重啓svnserve
[root@localhost conf]# ps -ef | grep svn | grep -v grep root 1261 1 0 17:16 ? 00:00:00 svnserve -d -r /application/svndata/ [root@localhost conf]# kill 1261 [root@localhost conf]# ps -ef | grep svn | grep -v grep [root@localhost conf]# svnserve -d -r /application/svndata/
3、搭建SVN客戶端
一、使用SVN客戶端(windows版)
軟件版本選擇
推薦:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7
注意:32位系統要用32位軟件版本
SVN客戶端安裝一直yes便可
SVN客戶端軟件的使用
先在本地建立一個目錄,起名任意,好比data
鼠標右鍵點擊data目錄
選擇右鍵菜單裏的SVN Checkout,出現下圖:
特別提示:
若是鏈接不通,請檢查Linux虛擬機的iptables是否關閉。
點擊OK
再次點擊OK之後,結束。此時目錄裏多了一個隱藏的目錄,表示此目錄已經和svn服務器連通
命令說明:
(1)SVN Checkout:至關於下載,第一次鏈接svn服務器的時候須要和服務器的對應存儲目錄進行數據同步,若是服務器的對應目錄裏有數據文件,那麼就會下載到你的本地對應目錄裏。
(2)SVN Update:更新數據,檢查服務器端svn存儲目錄裏是否和本地svn存儲目錄數據不一致,若是不一致,那麼下載改變或新增的部分到本地svn目錄裏。(不會刪除本地目錄內容)
(3)SVN Commit:提交數據到svn服務器端存儲目錄。本地svn存儲目錄會和服務器端存儲目錄進行比對校驗。會把本地改變的部分和新增的部分同步上傳至服務器端。
SVN客戶端使用測試
向windows的svn存儲目錄data裏放一個空文件
右鍵點擊data目錄,選擇SVN Commit
打開本地data目錄裏的文件,隨便寫點內容後,再次進行SVN commit
直接從本地查看服務器端的數據內容
右鍵點擊本地svn存儲目錄data,選擇TortoiseSVN ===>Repo-browser後出現下圖:
雙擊文件能夠直接遠程打開文件,能夠看到裏面剛剛被修改後的內容已經更新至服務器端。
刪除本地svn存儲目錄data裏的文件,後選擇SVN Update,會出現剛剛刪除的文件又從新下載回來了
繼續刪除本地svn存儲目錄data裏的文件,後選擇SVN Commit
再次查看服務器端存儲目錄裏,發現文件已經被刪除了
二、SVN的管理命令(Linux)
[root@localhost ~]# 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) #更新數據
從SVN庫提取數據
將文件checkout到本地目錄
svn checkout(co) remotepath localpath
[root@localhost ~]# mkdir yunjisuan [root@localhost ~]# cd yunjisuan/ [root@localhost yunjisuan]# pwd /root/yunjisuan #下載服務器端數據到Linux本地目錄 [root@localhost yunjisuan]# svn co svn://192.168.200.50/yunjisuan/ /root/yunjisuan/ --username=benet --password=123123
查看SVN版本庫中的數據
[root@localhost yunjisuan]# svn list file:///application/svndata/yunjisuan/
第一次提交的時候會失敗
提交前須要先標記,跟windows的勾選同樣
svn add *
Linux版本提交的時候每次都須要叫備註,隨便寫可是必須有
svn ci -m "message"
A 1
A 2
A 3
A 4
A 5
svn: warning: '666.txt.txt' is already under version control --->這個文件已經標記過了
svn: Commit failed (details follow):
svn: Authorization failed #提交失敗,帳戶沒有寫權限,認證失敗
換帳戶從新checkout
svn co svn://192.168.200.50/yunjisuan/ /root/yunjisuan/ --username=yunjisuan --password=123123
#換擁有寫入權限的帳戶checkoutStore password unencrypted (yes/no)? yes #是否做爲目錄的新帳戶和密碼
從新提交
svn add * svn ci -m "message"
查看服務器數據
svn list file:///application/svndata/yunjisuan/
4、SVN鉤子腳本
SVN鉤子腳本簡介
鉤子腳本的具體寫法就是操做系統中shell腳本程序的寫法,可根據本身的SVN所在的操做系統和shell程序進行相應的開發。
鉤子腳本就是被某些版本庫事件觸發的程序,例如:建立新版本或修改未被版本控制的屬性。每一個鉤子都能掌管足夠的信息來了解發生了什麼事件,操做對象是什麼以及觸發事件用戶的帳號。
根據鉤子的輸出或返回狀態,鉤子程序可以以某種方式控制該動做繼續執行,中止或掛起。
默認狀況下,鉤子的子目錄中包含各類版本庫鉤子模板
[root@localhost ~]# 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
SVN的hooks模板
經常使用的鉤子腳本
鉤子腳本 | 說明 |
---|---|
post-commit | 在提交完成成功建立版本以後執行該鉤子,提交已經完成,不可更改,所以,本腳本的返回值被忽略。提交完成時觸發事務 |
pre-commit | 提交完成前觸發執行該腳本 |
start-commit | 在客戶端尚未向服務器提交數據以前,即尚未創建Subversion transaction以前,執行該腳本(提交前出發事務) |
很是用的鉤子腳本
svn鉤子生產應用場景舉例
限制上傳文件擴展名及大小,控制提交要輸入的信息等。
SVN更新自動周知,MSN,郵件或短信周知。
SVN更新觸發checkout程序,而後實時rsync推送到服務器等。
(1)創建同步WEB目錄
mkdir -p /data/www
(2)將SVN中內容checkout到WEB目錄一份。
[root@localhost yunjisuan]# mkdir -p /data/www [root@localhost 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. [root@localhost 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
root@localhost yunjisuan]# cd /application/svndata/yunjisuan/hooks/ [root@localhost hooks]# cp post-commit.tmpl post-commit #複製模板一份 [root@localhost hooks]# egrep -v "#|^$" post-commit #模板原始內容 REPOS="$1" REV="$2" mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf [root@localhost hooks]# vim post-commit #修改post-commit腳本 [root@localhost 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)進行鉤子腳本同步測試
#刪除以前的測試記錄 [root@localhost hooks]# rm -rf /data/www/ [root@localhost hooks]# ll -d /data/www ls: cannot access /data/www: No such file or directory [root@localhost hooks]# rm -rf /tmp/* [root@localhost hooks]# ll /tmp/ total 0 [root@localhost hooks]# chmod 700 post-commit #給鉤子腳本可執行權限