svn倉庫遷移

如下是subversion官方推薦的備份方式。(如下方式所有保留commit日誌)
web

svnserver:數據庫

ip:192.168.85.130bash

hostname:vm2.lansgg.com服務器

data 目錄 :/svn/csvn/data/repositories/編輯器


svn  倉庫結構以下:每一個部門一個大的目錄,下面分別根據建立倉庫,示例目錄結構以下:
ide

wKioL1fJPJbD6KMIAAAvDh8eiXQ500.jpg-wh_50

情景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也是存在的

wKioL1fNHMrRntSDAACrEvHeLxY668.jpg-wh_50

情景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 ~]#

wKiom1fNORuzRxK4AABn1-C7KoE952.jpg-wh_50


情景四:

版本庫的結構以下,有reposA(dev)和reposB (ops) 這兩個版本庫,而後紅色的 reposA/dirB/code 就是須要移動的代碼目錄。原本打算用svn move來作的,後來發現由於是不一樣的版本庫,因此這個想法被淘汰了。因而就要在server上想辦法了,svnadmin有兩個參數dump和load能夠將版本庫提取出來/加載進去,還有命令svndumpfilter能夠過濾某些不想要/只想要的目錄,這些就足以達到目的了。

版本庫的結構以下,要將code移動到reposB/dirAA下邊:

wKioL1fOKYyDUUq4AAAqoPpBar0042.png-wh_50


https://vm2.lansgg.com/svn/dev/web/scan/  的 scan 遷移到 https://vm2.lansgg.com/svn/ops/opsdev/ 下面

wKioL1fOLoOgQgk4AABOgzEgbJ0971.jpg-wh_50

一、#將  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 文件夾

wKiom1fOa5Shs_mZAABZMXjQw_k548.jpg-wh_50

再次執行命令

[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/,而且保留了相應的提交日誌,目標達成。

wKiom1fObfyREzC2AAC9WItjaTg263.jpg-wh_50


情景五:

接上面的案例,若是想將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 裝載) >>>

wKioL1fOcb6Ap3WxAACXdQAoUaU903.jpg-wh_50

相關文章
相關標籤/搜索