SVN 自動備份

可以使用共享目錄

轉載:https://www.cnblogs.com/yadongliang/p/9233423.html

今天備份svn, 能保證好用就行先, 回頭再研究

buerguo.bat

@echo off
:: 關閉回顯
:: 說明:如有命令不明白,請使用幫助命令:命令/? 。如:for/?
:: 設置標題
title SVN備份腳本
rem 設置變量
:: SVN_HOME svn程序的安裝路徑,指定到bin目錄上一級。(如果路徑有空格,請用""。)
set SVN_HOME=D:\Develop\VisualSVNServer
:: SVN庫的路徑
set SVN_ROOT=D:\Repositories
:: 備份SVN父目錄的路徑
set SVN_BACKUP_ROOT=D:\svnrootbackup
:: 獲取當前系統日期和時間用來創建目錄,格式:年月日_時分秒毫秒。如:20131129_16275274
set TIME_DIR=%date:~,4%%date:~5,2%%date:~8,2%_%time:~,2%%time:~3,2%%time:~6,2%%time:~9,2%
:: SVN備份子目錄的路徑
set BACKUP_DIRECTORY=%SVN_BACKUP_ROOT%\%TIME_DIR%
:: 日誌文件路徑(將日誌和備份文件放在一個目錄,刪除時一起刪除了)
set LOG=%BACKUP_DIRECTORY%\backup.log
:: 指定備份文件刪除時間(單位:天)。0 - 32768 範圍內的任何數字。
set NUM=365
rem 開始備份SVN
:: 判斷SVN程序是否存在
if not exist %SVN_HOME% goto error
goto start
:start
:: 查詢日誌大小(單位:字節),超過1Mb就新建一個 (日誌放入備份目錄後,此語句無效。僅備份!)
:: for /r %SVN_BACKUP_ROOT% %%I in (backup.log) do if %%~zI GEQ 1048576 ren %LOG% backup_%TIME%.log
:: 新建目錄
mkdir %BACKUP_DIRECTORY%
:: 建立日誌
@echo [info]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%建立備份目錄:%BACKUP_DIRECTORY% >>%LOG%
:: 備份SVN版本庫並輸出日誌到文件
for /d %%i in (%SVN_ROOT%\*) do (
@echo 備份 %%~ni 庫,備份文件名:%%~ni.dmp >>%LOG%
:: 完整備份(增量備份在dump後面添加參數 --incremental)
%SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%%~ni >%BACKUP_DIRECTORY%\%%~ni.dmp 2>>%LOG%
)
:: 輸出備份命令退出碼,用來判斷是否備份成功。成功的退出碼爲0.
@echo [info]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%退出碼爲:%errorlevel%>>%LOG%
:: 自動設置計劃任務:每週六 晚上11點執行本腳本。
at 23:00 /next:S %~f0>>%LOG%
:: 刪除過期備份
goto delete
:delete
:: 輸出要刪除的目錄到日誌文件
@echo [info]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%刪除%NUM%天前的備份:>>%LOG%
forfiles /P %SVN_BACKUP_ROOT% /M *_* /D -%NUM% /C "cmd /c echo 刪除文件夾:@file">>%LOG%
:: 使用rd命令刪除超過%NUM%天的備份目錄。如果不存在匹配條件的目錄,將提示:錯誤: 用指定的搜索標準沒有找到文件。如果存在匹配的文件,則提示:目錄名無效
forfiles /P %SVN_BACKUP_ROOT% /M *_* /D -%NUM% /C "cmd /c rd /s/q @path" 2>>%LOG%
goto end
:error
echo [error]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%程序目錄不存在,請檢查:%SVN_HOME%>>%LOG%
goto end
:end
:: 輸出一行空行分割日誌
@echo. >>%LOG%
exit
:: 調試腳本用的命令
:: at 16:06 %~f0
:: PAUSE
:: exit

修改三個路徑即可

:: SVN_HOME svn程序的安裝路徑,指定到bin目錄上一級。(如果路徑有空格,請用""。)
set SVN_HOME=D:\Develop\VisualSVNServer
:: SVN庫的路徑
set SVN_ROOT=D:\Repositories
:: 備份SVN父目錄的路徑
set SVN_BACKUP_ROOT=D:\svnrootbackup
=========================================================================
創建好該批處理文件放到了repository下(和路徑沒關係吧), 雙擊執行在指定目錄下生成一個備份文件如下圖:

如何還原:
1.啓動svnServer客戶端, 新建一個repository(注意不要創建branches tags 和 trunk文件夾) , 就命名爲demp吧

在磁盤中可以找到該名爲demp的repository

 

2.打開命令行窗口, 輸入以下命令:

svnadmin load D:\Repositories\demp < D:\svnrootbackup\20180627_12565811\buerguo.dmp

 

這就完事兒了,有問題在討論吧批處理文件無非就是把手動敲的簡化了一些,還有就是可以把這個文件加入到計算機定時任務中進行執行方便自動備份倉庫。 

 

==========分割(詳細步驟可以看看,小項目小團隊用svn,大項目團隊稍微大點svn貌似顯得雞肋了。。)============

補充:可參考另一篇備份還原的實踐,比較細緻,https://blog.csdn.net/hzfw2008/article/details/78082685

【1.業務需求】


經過前面的SVN搭建,權限配置和強制寫日誌的工作之後,今天的任務是把原來其它分散的各個版本庫統一遷移到新的版本庫,集中統一管理。要求不改變原有的版本庫的內容和版本號。

【2.基本思路】


要實現版本庫的無縫遷移,必須通過以下3個步驟:

  • 導出舊的版本庫
  • 導入新的版本庫
  • 通知客戶端切換版本庫分支


首 先來看第一步:導出舊的版本庫。我們知道SVN提供了check out命令和export命令簽出,導出版本庫中的內容。對於版本庫內容比較少的情況這種方法可以採用。但是如果版本庫中內容比較多,那麼這種方法就顯得 很笨重了,而且還涉及到版本號改變的問題。所以首先擯棄這種做法。

我們知道Oracle提供了export/import命令來將數據 庫導出成一個二進制文件,然後導入。同樣的SVN也提供了一對命令:dump和 load。不同的是這兩個命令導出的是文本內容(肉眼可以讀懂)。而且還有一次性導出和增量導出,單版本導出與多版本導出等多種選擇操作,就是這個了。

其次我們來看“通知客戶端切換版本庫分支”。在我們完成服務器端的版本遷移之後,必須通知客戶端運行切換分支的命令,否則客戶端的提交還是提交到舊的版本庫去。SVN也爲我們準備了這樣的命令:svn switch。

【3.相關命令】


首先我們來看一下SVN的dump和load命令
 

  • svnadmin dump命令語法

 

svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [--incremental]


svnadmin dump命令用於導出整個Repository或Repository下的某個範圍的修訂版本。REPOS_PATH是版本庫的路徑,[-r LOWER[:UPPER]]用於指定導出的修訂版本範圍,由參數-r和兩個用:號隔開阿拉伯數字組成。例如:-r 0:50表示導出才版本0到版本50之間的所有修訂版,-r是revision的縮寫。

而另一個關鍵參數是--incremental。 它使用增量方式來導出版本,即每次都只導出自上一個版本以來的修改。這樣的好處是第一:可以把一個大的文 件切分成若干個小的文件。第二:在版本庫已經存在的情況下,我們只需要每次導出修改的部分,不需要每次都導出整個版本庫的內容。甚至可以通過hook腳本 每天晚上自動將當天的修改dump出來做備份用。
 

  • svnadmin load命令語法

 

svnadmin load REPOS_PATH


svnadmin load命令用於從標準輸入流/其它流中導入版本庫,REPOS_PATH是要導入的目標版本庫。
 

  • dump和load的輸出/入重定向

 

svnadmin dump myrepos > dumpfile

svnadmin load newrepos < dumpfile


默認情況下dump和load命令分別輸出到默認輸出設備(屏幕)和從默認輸入設備(鍵盤)導入。但我們也可以把輸出流/輸入流重定向。例如上面 的第一個 命令,使用重定向符>把屏幕的輸出定向當前目錄下的dumpfile,而第二個命令從當前目錄下的dumpfile文件導入。

上面的命令使用起來已經很方便了,那麼還有沒有更加方便的用法呢?當然有!就是使用管道命令把兩個命令合二爲一。

svnadmin dump myrepos | svnadmin load newrepos

 

  • svn switch命令語法

 

svn switch URL [PATH]
switch --relocate FROM TO [PATH]

svn switch命令用於更新工作副本的URL。意即指向新的版本庫位置。首先要注意的一點是我們即可以將整個工作副本指向新的URL,也可將工作副本下的某個目錄指向新的URL。

另外一個重要的參數就是--relocate。這個參數是否使用對於結果如何有很大影響,使用不當甚至可能會造成版本庫不可用。其中有兩條重要的規則:
 A.假如工作副本只是映射到同一個版本庫內的不同位置,那麼使用svn switch即可
B.假如工作副本已是映射到不同的版本庫,那麼必須使用svn switch --relocate

上面第二條規則通常發生在我們需要將整個版本庫遷移到另外一臺機,或者同一臺機的不同版本庫時。這個時候使用--relocate會刷新原有工作副本中每個文件的URL頭部。

【4.示例操作】


好了,下面我們來看如何執行版本庫的遷移工作。
 

  • 查看當前舊版本庫最新的版本號是多少

 

C:\peng\Other>svnlook youngest newRepo
161

 

  • 分批增量導出版本庫內容

 

C:\peng\Other>svnadmin dump newRepo -r 0:50 > dumpfile1
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
 

導出第一個文件,版本號從0到50的修訂版本
 

C:\peng\Other>svnadmin dump newRepo -r 51:100 --incremental > dumpfile2
* Dumped revision 51.
* Dumped revision 52.
* Dumped revision 53.
* Dumped revision 54.
* Dumped revision 55.
 

導出第二個文件,版本號從51到100的修訂版本
 

C:\peng\Other>svnadmin dump newRepo -r 101:161 --incremental > dumpfile3
* Dumped revision 101.
* Dumped revision 102.
* Dumped revision 103.
* Dumped revision 104.
* Dumped revision 105.
 

 

請注意我們上面三個命令中第2,3個命令多了一個--incremental的參數,這就是採用了增量的方式導出,下面我們一次按照順序導入
 

 

  • 分批導入版本庫文件

 

C:\peng\Other>svnadmin load newRepo2 < dumpfile1
<<< 開始新的事務,基於最初的修訂版 1
* 正在添加路徑:a  done.

------- 提交後的修訂版 1 >>>

<<< 開始新的事務,基於最初的修訂版 2
* 正在刪除路徑:a  done.
 

首先導入dumpfile1,然後是dumpfile2,dumpfile3
 

C:\peng\Other>svnadmin load newRepo2 < dumpfile2
<<< 開始新的事務,基於最初的修訂版 50
* 正在添加路徑:branches  done.

------- 提交新修訂版 12 (從原始修訂版 50 裝載) >>>

<<< 開始新的事務,基於最初的修訂版 51
* 正在刪除路徑:branches  done.

------- 提交新修訂版 13 (從原始修訂版 51 裝載) >>>
 

導入文件dumpfile2。依次類推dumpfile3。

如果我們前面不使用--incremental方式導出,此處分批導入三個dump文件,則會提示錯誤:版本庫文件已經存在。
 

  • 客戶端切換工作副本URL

 

C:\peng\Other>svnserve -d -r c:\peng\other


首先我們把SVN服務的根目錄指向c:\peng\other目錄,在這個目錄下有兩個repository,其中一個名爲newRepo,另外一個名爲呢wRepo2。

C:\peng\Other>dir
Volume in drive C is ESOE_W2K
Volume Serial Number is BC1B-22E6

Directory of C:\peng\Other

2008-12-26  15:10       <DIR>          .
2008-12-26  15:10       <DIR>          ..
2008-12-23  10:04       <DIR>          Backup
2008-12-26  14:21               45,578 dumpfile1
2008-12-26  14:22               39,567 dumpfile2
2008-12-26  14:23               55,740 dumpfile3
2008-12-15  09:08       <DIR>          newRepo
2008-12-26  14:20       <DIR>          newRepo2
2008-12-26  15:25       <DIR>          ps
2008-12-24  15:11       <DIR>          Toolbar
3 File(s)        140,885 bytes
7 Dir(s)   2,668,414,976 bytes free

C:\peng\Other>


首先我們從newRepo這個版本庫中check out出一個子目錄ps

C:\Documents and Settings\qlinpen.E0015609D6309>svn checkout svn://localhost/newRepo/ps c:/peng/other/ps
A    C:\peng\Other\ps\ps.txt
取出修訂版 170。


現在該工作副本已經和:svn://localhost/newRepo/ps發生了映射關係。我們可以使用svnlook info來顯示這個工作副本的一般信息

C:\peng\Other>cd ps

C:\peng\Other\ps>svn info
路徑:.
地址(URL):svn://localhost/newRepo/ps
Repository Root: svn://localhost/newRepo
檔案庫 UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078
修訂版:170
節點種類:目錄
調度:正常
最後修改的作者:admin
最後修改的修訂版:170
最後修改的時間: 2008-12-26 14:52:32 +0800 (星期五, 26 十二月 2008)


輸出信息中明確地指出ps目錄指向了svn://localhost/newRepo/ps。下面我們來把它指向另一個repository下的同名位置:svn://localhost/newRepo2/ps。

C:\peng\Other\ps>svn switch --relocate svn://localhost/newRepo/ps svn://localhost/newRepo2/ps

C:\peng\Other\ps>


經過上面的切換後,再次使用svnlook info輸出一般信息,發現URL已經被成功切換過來了

C:\peng\Other\ps>svn info
路徑:.
地址(URL):svn://localhost/newRepo2/ps
Repository Root: svn://localhost/newRepo2
檔案庫 UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078
修訂版:170
節點種類:目錄
調度:正常
最後修改的作者:admin
最後修改的修訂版:170
最後修改的時間: 2008-12-26 14:52:32 +0800 (星期五, 26 十二月 2008)


我們嘗試着在ps目錄下修改文件ps.txt爲ps.doc,然後提交看看會提交到那個repos去?

C:\peng\Other\ps>svn list svn://localhost/newRepo/ps
ps.txt

C:\peng\Other\ps>svn list svn://localhost/newRepo2/ps
ps.doc

C:\peng\Other\ps>

 

很明顯現在的提交全部都去到新的位置了!切換成功。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章