前段時間把SVN版本庫從win遷移到了Linux上,沒隔幾天那臺win的磁盤就嚴重壞道了。。。。這TMD什麼運氣!linux
花費了點時間研究了下svn本身的同步工具。寫個日誌記錄下。緩存
注意:svnsync要求svn版本1.4+服務器
下面的內容來自svnbook-1.4
svnsync svnsync是Subversion的遠程版本庫鏡像工具,它容許你把一個版本庫的內容錄入到另外一個。 在任何鏡像場景中,有兩個版本庫:源版本庫,鏡像(或「sink」)版本庫,源版本庫就是svnsync獲取修訂版本的庫,鏡像版本庫是源版本庫修訂版本的目標,兩個版本庫能夠是在本地或遠程—它們只是經過URL跟蹤。 svnsync進程只須要對源版本庫有讀權限;它不會嘗試修改它。可是很明顯,svnsync能夠讀寫訪問鏡像版本庫。 警告 svnsync對於不能做爲鏡像操做一部分的修改很是敏感,爲了防止發生這個狀況,最好保證svnsync是惟一能夠修改鏡像版本庫的進程。 svnsync選項 --config-dir DIR 指導Subversion從指定目錄而不是默認位置(用戶主目錄的.subversion)讀取配置信息。 --no-auth-cache 阻止在Subversion管理區緩存認證信息(如用戶名密碼)。 --non-interactive 若是認證失敗,或者是不充分的憑證時,防止出現要求憑證的提示(例如用戶名和密碼)。這在運行自動腳本時很是有用,只是讓Subversion失敗而不是提示更多的信息。 --password PASS 指出在命令行中提供你的密碼—另外,若是它是須要的,Subversion會提示你輸入。 --username NAME 表示你要在命令行提供認證的用戶名—不然若是須要,Subversion會提示你這一點。
來源SVN:192.168.2.5網絡
備份SVN:192.168.3.10dom
$ svnadmin create svn-mirror
配置來源、備份SVN,建立用戶:syncusersvn
請確認syncuser用戶對備份SVN有寫入權限。對來源SVN有讀取權限。且密碼相同。工具
#!/bin/sh USER="$3" # 限制只有syncuser用戶才能提交版本屬性修改到此版本庫 if [ "$USER" = "syncuser" ]; then exit 0; fi echo "Only the syncuser user may change revision properties" >&2 exit 1 # 固然某些網絡教程說的是你能夠直接清空而後寫入exit 0 ,這種方法雖然能夠作,可是注意svnbook中的這句話: # svnsync的通信議對於源和目標版本庫版本歷史的不一致很是敏感,所以,雖然svnsync沒法要求目標版本庫是隻讀的,[34]最好的辦法就是隻容許鏡像進程修改目標版本庫內容。(PS:鏡像==來源SVN 目錄==備份SVN) # [34] 實際上,它不是真的徹底只讀,或者svnsync自己有時間將版本庫歷史拷入。
配置備份SVN的start-commit hook【可選,但建議配上】post
#!/bin/sh USER="$2" # 限制只用syncuser用戶才能提交版本修改到版本庫 if [ "$USER" = "syncuser" ]; then exit 0; fi echo "Only the syncuser user may commit new revisions" >&2 exit 1
初始化備份SVN測試
$ svnsync initialize http://192.168.3.10/svn-mirror \ http://192.168.2.5/Dev-rep \ --username syncuser --password syncpass Copied properties for revision 0. # initialize 能夠簡寫爲 init 因此上面的命令能夠寫做以下: $ svnsync init http://192.168.3.10/svn-mirror \ http://192.168.2.5/Dev-rep \ --username syncuser --password syncpass # 注意 # 提供給svnsync的URL必須是指向目標和源版本庫的根目錄,這個工具不支持對版本庫子樹的鏡像處理。
在備份SVN測試數據同步spa
$ svnsync synchronize http://192.168.3.10/svn-mirror \ --username syncuser --password syncpass
# 注意
# svnsync的最第一版本(在Subversion 1.4)有一些缺陷—-用來認證的--username和--password命令行參數同時做用於源和目標版本庫。
# 顯然,咱們沒法保證同步的用戶認證信息是相同的,若是不同,用戶使用非交互模式(--non-interactive選項)來運行svnsync時會遇到這個問題(PS:也就是認證沒法經過)。 # 如今有趣的部分開始了,經過一個單獨的子命令,咱們能夠告訴svnsync將全部鏡像的修訂版本從源版本庫拷貝到目標版本庫。
# [35]svnsync synchronize子命令會查看目標版本庫特定修訂版本的屬性,而且檢測同步的版本庫是哪個,以及最新鏡像的修訂版本是0。而後它會查詢源版本庫,檢測其最新的修訂版本。
# 最後,它會詢問源版本庫服務器來開始重演從修訂版本0到最新修訂版本。svnsync從源版本庫服務器獲得返回的結果,而後將其做爲新的提交轉發到目標版本庫服務器。 # [35] 要預先警告一下,儘管對於普通讀者只須要幾秒鐘就能夠理解下面的輸出,而對於整個鏡像過程花費的時間可能會很是長。
在來源SVN配置post-commit hook,啓用實時備份
$ svnsync synchronize --non-interactive http://192.168.3.10/svn-mirror \ --username syncuser --password syncpass # --non-interactive 非交互模式,若是程序須要參數,讓程序自行處理
請配置pre-revprop-change hook
使用 svnsync synchronize 同步時異常終止。如:機器停電,斷網等。
$ svn propdel svn:sync-lock --revprop -r HEAD http://192.168.3.10/svn-mirror
這個錯誤通常不會遇到,svnsync只適用於1.4+版本。請升級該SVN。