咱們最終的目的是:當本地提交後,SVN服務器自動更新服務器端指定WEB目錄內的文件python
實現方法:編程
找到服務器端 SVN版本庫所在的目錄(目錄名稱是Repositories),這個目錄是在安裝VisualSVN Server設置的,根據你安裝時的設置找到Repositories這個目錄,在這個目錄下面找到你建立的項目目錄,在項目目錄下面找到hooks目 錄,在此目錄中建立一個名爲post-commit.bat的批處理文件,內容以下:緩存
@echo off
"D:\VisualSVN Server\bin\svn.exe" update "D:\你的網站目錄" --username XXXXX --password XXXXX安全
//將svn.exe的目錄設置爲你的VisualSVN Server安裝目錄,設置好你的用戶名和密碼bash
同步程序思路:用戶提交程序到SVN,SVN觸發hooks,按不一樣的hooks進行處理,這裏用到的是post-commit,利用post- commit到代碼檢出到SVN服務器的本地硬盤目錄,再經過rsync同步到遠程的WEB服務器上。服務器
hooks文件詳解svn
# start-commit 提交前觸發事務
# pre-commit 提交完成前觸發事務
# post-commit 提交完成時觸發事務
# pre-revprop-change 版本屬性修改前觸發事務
# post-revprop-change 版本屬性修改後觸發事務
經過上面這些名稱編寫的腳本就就能夠實現多種功能了,至關強大。
二、同步命令rsync的具體參數使用
三、具備基個語言的編程能力bash python perl均可以實現post
post-commit具體實現細節
post-commit腳本網站
#!/bin/sh
# -------------------------------------------------------------------------------
# Filename: post-commit
# Description: WEB server with synchronization code by SVN
# -------------------------------------------------------------------------------
#Version 1.0
#當用戶把代碼提交完成時,把代碼中的最新更改同步到 WEB服務器,同時注意不包括刪除操做。日誌
#Set variable
SVN=/usr/bin/svn
WEB=/home/test_nokia/
RSYNC=/usr/bin/rsync
LOG=/tmp/rsync_test_nokia.log
WEBIP="192.168.0.23"
export LANG=en_US.UTF-8
#update the code from the SVN
$SVN update $WEB --username user --password password
#若是前面的代碼成功完成,會繼續執行下面的代碼
if [ $? == 0 ]
then
echo "" >> $LOG
echo `date` >> $LOG
echo "##############################" >> $LOG
chown -R nobody:nobody /home/test_nokia/
#同步代碼從SVN服務器到WEB服務器 notes:by the key
$RSYNC -vaztpH --timeout=90 --exclude-from=/home/svn/exclude.list $WEB root@$WEBIP:/www/ >> $LOG
fi
以上是具體的post-commit程序
注意事項:
一、必定要定義變量,主要是用過的命令的路徑。由於SVN的考慮的安全問題,沒有調用系統變量,若是手動執行是沒有問題,但SVN自動執行就會沒法執行了。
二、SVN update 以前必定要先手動checkout一份出來,還有這裏必定要添加用戶和密碼 若是隻是手動同樣會更新,但自動同樣的不行。
三、加上了對前一個命令的判斷,若是update的時候出了問題,程序沒有退出的話還會繼續同步代碼到WEB服務器上,這樣會形成代碼有問題
四、記得要設置所屬用戶,由於rsync能夠同步文件屬性,並且咱們的WEB服務器通常都不是root用戶,用戶不正確會形成WEB程序沒法正常工做。
五、建議最好記錄日誌,出錯的時候能夠很快的排錯
六、最後最關鍵的數據同步,rsync的相關參數必定要清楚,這個就不說了。注意幾個場景:
這裏的環境是SVN服務器與WEB服務器是開的
把SVN服務器定義爲源服務器 WEB服務器爲目的服務器
場景1、若是目的WEB服務器爲綜合的混雜的,像只有一個WEB靜態資源,用戶提交的,自動生成的都在WEB的一個目錄下,建議不要用–delete這個參數
上面這個程序就是這樣,實現的是源服務器到目的服務器的更新和添加,而沒有刪除操做,WEB服務器的內容會多於源SVN的服務器的
場景2、實現鏡像,即目的WEB服務器與源SVN服務器同樣的數據,SVN上任何變化WEB上同樣的變化,就須要–delete參數
場景3、不須要同步某些子目錄,可能有些目錄是緩存的臨時垃圾目錄,或者是專用的圖片目錄(而不是樣式或者排版的)要用exclude這個參數
注意:這個參數的使用不用寫絕對路徑,只要目錄名稱就行 aa表明文件 aa/ 表明目錄 ,缺點就是若是有多個子目錄都是同樣的名稱 那麼這些名稱就都不會被同步
建議用–exclude-from=/home/svn/exclude.list 用文件的形式能夠方便的添加和刪除
exclude.list
.svn/
.DS_Store
images/
利用SVN的鉤子還能夠寫出不少的程序來控制SVN 如代碼提交前查看是否有寫日誌,是否有tab,有將換成空格,是否有不容許上傳的文件,是否有超過限制大小的文件等等。