前段時間把SVN版本庫從win遷移到了Linux上,沒隔幾天那台win的磁盤就嚴重壞道了。。。。這TMD什么運氣!
花費了點時間研究了下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.10
- 創建備份空版本庫
$ svnadmin create svn-mirror
-
配置來源、備份SVN,創建用戶:syncuser
請確認syncuser用戶對備份SVN有寫入權限。對來源SVN有讀取權限。且密碼相同。
- 配置備份SVN的pre-revprop-change hook
#!/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【可選,但建議配上】
#!/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測試數據同步
$ 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 非交互模式,如果程序需要參數,讓程序自行處理
- 異常處理
- svnsync: E165006: Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook請配置pre-revprop-change hook
- Failed to get lock on destination repos, currently held by 'localhost.localdomain:d1dfeaac-b028-4484-a1ec-ae455ba090e1'
使用 svnsync synchronize 同步時異常終止。如:機器停電,斷網等。
$ svn propdel svn:sync-lock --revprop -r HEAD http://192.168.3.10/svn-mirror
- svnsync: The requested report is unknown.
這個錯誤一般不會遇到,svnsync只適用於1.4+版本。請升級該SVN。
好了,svn實時備份就到這兒。如有疑問,請留言。