如下是subversion官方推薦的備份方式。(如下方式所有保留commit日誌)
web
svnserver:數據庫
ip:192.168.85.130bash
hostname:vm2.lansgg.com服務器
data 目錄 :/svn/csvn/data/repositories/編輯器
svn 倉庫結構以下:每一個部門一個大的目錄,下面分別根據建立倉庫,示例目錄結構以下:ide
情景1、整目錄(倉庫)遷移svn
將dev整個遷移到另一個svn服務器(如:vm1.lansgg.com)spa
由於是整個目錄遷移,只須要將整個倉庫目錄rsync到 vm1.lansgg.com 上的倉庫位置便可,單獨進行權限配置,而且log也是完整保存。3d
情景2、倉庫遷移日誌
將dev目錄下的web項目 ( dev/web )遷移到qa目錄 (qa/web)下;
將 https://vm2.lansgg.com/svn/dev/web/ 遷移到 https://vm2.lansgg.com/svn/qa/ 下
一、先將整個目錄備份:
[root@vm2 ~]# svnadmin dump /svn/csvn/data/repositories/dev > dev.dump * 已轉存版本 0。 * 已轉存版本 1。 * 已轉存版本 2。 [root@vm2 ~]#
二、咱們須要將 dev 倉庫中的 web 目錄進行遷移,因此咱們還須要進行過濾。以下:
[root@vm2 ~]# svndumpfilter include web < dev.dump > dev.web.dump 包含的前綴: '/web' 版本 0 提交爲 0。 版本 1 提交爲 1。 版本 2 提交爲 2。 丟棄 1 個節點: '/wap' [root@vm2 ~]#
三、將過濾出來的dump 文件進行還原
[root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/qa/ < dev.web.dump <<< 開始新的事務,基於原始版本 1 * 正在增長路徑: web ...完成。 * 正在增長路徑: web/t2.jpg ...完成。 * 正在增長路徑: web/t3.jpg ...完成。 * 正在增長路徑: web/t4.jpg ...完成。 * 正在增長路徑: web/新建 Microsoft Access 數據庫.accdb ...完成。 * 正在增長路徑: web/新建 Microsoft Word 文檔.docx ...完成。 * 正在增長路徑: web/新建文本文檔.txt ...完成。 ------- 提交後版本 1 >>> <<< 開始新的事務,基於原始版本 2 ------- 提交後版本 2 >>> [root@vm2 ~]#
還原完成,commit log也是存在的
情景3、將上面分離出來的 web 目錄做爲一個新的倉庫進行恢復
將 https://vm2.lansgg.com/svn/dev/web/ 遷移到 https://vm2.lansgg.com/svn/web 下
若是你想將 web 目錄做爲一個新的倉庫進行恢復,
不過它保留了原版本庫的精確路徑結構。也就是說,雖然項目 web 如今獨佔了一個版本庫,但版本庫中還保留着名爲 web 的頂級目錄。若是但願trunk、tags和branches這三個目錄直接位於版本庫的根路徑下,你可能須要編輯轉儲文件,調整Node-path和Copyfrom-path頭參數,將路徑 web/ 刪除。同時,你還要刪除轉儲數據中建立 web 目錄的部分。通常來講,就是以下的一些內容:
(刪掉以下內容,而且將全部文件前路徑的web路徑刪掉。)
Node-path: web
Node-action: add
Node-kind: dir
Content-length: 0
警告:
若是你打算經過手工編輯轉儲文件來移除一個頂級目錄,注意不要讓你的編輯器將換行符轉換爲本地格式(好比將\r\n轉換爲\n)。不然文件的內容就與所需的格式不相符,這個轉儲文件也就失效了。
剩下的工做就是建立1個新的版本庫,而後將轉儲文件導入:
[root@vm2 ~]# svnadmin create /svn/csvn/data/repositories/web [root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/web/ < dev.web.dump <<< 開始新的事務,基於原始版本 1 * 正在增長路徑: /t2.jpg ...完成。 * 正在增長路徑: /t3.jpg ...完成。 * 正在增長路徑: /t4.jpg ...完成。 * 正在增長路徑: /新建 Microsoft Access 數據庫.accdb ...完成。 * 正在增長路徑: /新建 Microsoft Word 文檔.docx ...完成。 * 正在增長路徑: /新建文本文檔.txt ...完成。 ------- 提交後版本 1 >>> <<< 開始新的事務,基於原始版本 2 ------- 提交後版本 2 >>> [root@vm2 ~]#
情景四:
版本庫的結構以下,有reposA(dev)和reposB (ops) 這兩個版本庫,而後紅色的 reposA/dirB/code 就是須要移動的代碼目錄。原本打算用svn move來作的,後來發現由於是不一樣的版本庫,因此這個想法被淘汰了。因而就要在server上想辦法了,svnadmin有兩個參數dump和load能夠將版本庫提取出來/加載進去,還有命令svndumpfilter能夠過濾某些不想要/只想要的目錄,這些就足以達到目的了。
版本庫的結構以下,要將code移動到reposB/dirAA下邊:
將 https://vm2.lansgg.com/svn/dev/web/scan/ 的 scan 遷移到 https://vm2.lansgg.com/svn/ops/opsdev/ 下面
一、#將 dev 倉庫備份到一個文件中
[root@vm2 ~]# svnadmin dump /svn/csvn/data/repositories/dev/ > dev.dump * 已轉存版本 0。 * 已轉存版本 1。 * 已轉存版本 2。 * 已轉存版本 3。 * 已轉存版本 4。 [root@vm2 ~]#
二、#將 dev 中的 scan 過濾出來,svndumpfilter include表示只保留制定的目錄和文件
[root@vm2 ~]# svndumpfilter include web/scan < dev.dump > dev.scan.dump 包含的前綴: '/web/scan' 版本 0 提交爲 0。 版本 1 提交爲 1。 版本 2 提交爲 2。 版本 3 提交爲 3。 版本 4 提交爲 4。 丟棄 8 個節點: '/wap' '/web' '/web/t2.jpg' '/web/t3.jpg' '/web/t4.jpg' '/web/新建 Microsoft Access 數據庫.accdb' '/web/新建 Microsoft Word 文檔.docx' '/web/新建文本文檔.txt' [root@vm2 ~]#
三、#將 dumpfile 導入相應的目錄,也就是ops/opsdev/,用parent-dir來指定
[root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/ops --parent-dir opsdev < dev.scan.dump <<< 開始新的事務,基於原始版本 1 ------- 提交新版本 2 (從原始版本 1 裝載) >>> <<< 開始新的事務,基於原始版本 2 ------- 提交新版本 3 (從原始版本 2 裝載) >>> <<< 開始新的事務,基於原始版本 3 ------- 提交新版本 4 (從原始版本 3 裝載) >>> <<< 開始新的事務,基於原始版本 4 svnadmin: 沒有找到文件: 事務「4-4」,路徑 「opsdev/web/scan」 * 正在增長路徑: opsdev/web/scan ...[root@vm2 ~]#
這個時候,須要給 ops 下的 opsdev 新建一個 web 文件夾
再次執行命令
[root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/ops --parent-dir opsdev < dev.scan.dump <<< 開始新的事務,基於原始版本 1 ------- 提交新版本 6 (從原始版本 1 裝載) >>> <<< 開始新的事務,基於原始版本 2 ------- 提交新版本 7 (從原始版本 2 裝載) >>> <<< 開始新的事務,基於原始版本 3 ------- 提交新版本 8 (從原始版本 3 裝載) >>> <<< 開始新的事務,基於原始版本 4 * 正在增長路徑: opsdev/web/scan ...完成。 * 正在增長路徑: opsdev/web/scan/adxnotice.pdf ...完成。 ------- 提交新版本 9 (從原始版本 4 裝載) >>> [root@vm2 ~]#
四、而後,scan 文件夾如今在 https://vm2.lansgg.com/svn/ops/opsdev/web/scan/ 這個路徑,可使用svn mv在客戶端移動目錄
[root@vm2 ~]# svn mv --username=admin https://vm2.lansgg.com/svn/ops/opsdev/web/scan/ https://vm2.lansgg.com/svn/ops/opsdev/ -m "old to new" 提交後的版本爲 10。 [root@vm2 ~]#
這樣就把reposA/dirB/code/ 轉移到了 reposB/dirAA/code/,而且保留了相應的提交日誌,目標達成。
情景五:
接上面的案例,若是想將scan下面的文件移動到ops下的doc目錄呢?
一切的遷移只要你會修改dump文件就簡單了。
好比以下:修改 上面過濾出來的 dev.scan.dump 文件
Node-path: web/scan Node-action: add Node-kind: dir Prop-content-length: 10 Content-length: 10 PROPS-END #######以上刪掉 Node-path: web/scan/adxnotice.pdf #web/scan 修改成 doc 便可。 Text-content-md5: ed04336a819674fb4f7492ac857ec2c6 Node-action: add Text-content-sha1: eab72cc358e344dac94346186efd88eae2e39be2 Node-kind: file Prop-content-length: 59 Text-content-length: 152699 Content-length: 152758
再次執行命令:
[root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/ops --parent-dir doc < dev.scan.dump <<< 開始新的事務,基於原始版本 1 ------- 提交新版本 16 (從原始版本 1 裝載) >>> <<< 開始新的事務,基於原始版本 2 ------- 提交新版本 17 (從原始版本 2 裝載) >>> <<< 開始新的事務,基於原始版本 3 ------- 提交新版本 18 (從原始版本 3 裝載) >>> <<< 開始新的事務,基於原始版本 4 * 正在增長路徑: /doc/adxnotice.pdf ...完成。 ------- 提交新版本 19 (從原始版本 4 裝載) >>>