The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何升級 Subversion 儲存庫版本 (SVN Repository)

最近在整理一些舊專案 SVN 目錄時,發現了一些整理過的目錄無法取得之前的 LOG 資訊,而出現了以下圖示的錯誤訊息,這是因為 SVN 儲存庫太舊的關係,所以必須將 SVN 伺服器上的儲存庫一一升級,以下是我將 SVN Repository 升級的筆記。

 Querying mergeinfo requires version 3 of the FSFS filesystem schema; filesystem uses only version 2

兩種升級方式

  1. 透過新版的 Subversion 指令列工具執行 svnadmin upgrade
    1. 優點:執行速度快 ( 僅需幾秒鐘完成 )
    2. 缺點:無法最佳化儲存庫狀態,檔案空間無法節省
  2. 手動先將儲存庫匯出,建立新版儲存庫後再匯入
    1. 優點:重新匯出、匯入過的儲存庫為最佳狀態
    2. 缺點:執行時間冗長,且匯出時也挺佔磁碟空間

磁碟空間差別

我原本的儲存庫大小為 1.02 GB (1,104,493,696 位��組) 在利用 svnadmin upgrade 升級後目錄所佔用的磁碟大小其實沒多大變化,但若透過匯出再匯入之後的磁碟大小為 991 MB (1,040,049,771 位元組),節省了 61MB 左右 (好像沒差多少),至於在執行效能方面不確定有沒有差異。

我在匯出儲存庫時,原大小雖為 1.02 GB 但匯出後的 dump 檔卻有 2.00 GB (2,156,124,465 位元組)

升級方法 1:自動升級方式

svnadmin upgrade REPOS_PATH

以下列出 svnadmin help upgrade 的說明文字僅供參考:

C:\>svnadmin help upgrade
upgrade: usage: svnadmin upgrade REPOS_PATH

Upgrade the repository located at REPOS_PATH to the latest supported
schema version.

This functionality is provided as a convenience for repository
administrators who wish to make use of new Subversion functionality
without having to undertake a potentially costly full repository dump
and load operation. As such, the upgrade performs only the minimum
amount of work needed to accomplish this while still maintaining the
integrity of the repository. It does not guarantee the most optimized
repository state as a dump and subsequent load would.

升級方法 2:手動升級方式 ( 建議用自動升級的方式處理即可 )

首先,你必須先知道你的 SVN Repository 是哪個版本。

用記事本開啟 {REPOS}\db\format 檔案,此檔案內容只有一個數字,該數字就是 Repository 的版本。而各版本所代表的數字所對應的 Subversion 版本如下 ( 參考自 svn repository upgrade procedure ):

  • 1            Subversion 0.27 之前的版本 ( 包括 0.27 版 )
  • 2            Subversion 0.28 - 0.33.1
  • 3            Subversion 0.34 - 1.3
  • 4            (no released version used this)
  • 5            Subversion 1.4 以後的版 ( 包括 1.4 版 )

升級程序如下:

1. 先將目錄更名

ren myrepos old-repos

2. 利用舊版的 svnadmin 指令匯出儲存庫(Repository)

svnadmin dump old-repos > dumpfile

3. 利用新版的 svnadmin 重新建立 SVN 儲存庫目錄

svnadmin create myrepos

4.用新版的 svnadmin 載入先前備份的 SVN 儲存庫

svnadmin load myrepos < dumpfile

5. 將原 SVN 儲存庫的 hooks 指令檔複製到新版的 SVN 儲存庫中

copy old-repos/hooks/* repos/hooks/

:如果你用 BDB 格式,必須將 old-repos/db/DB_CONFIG 複製到新版的 db 目錄下

copy old-repos/db/DB_CONFIG repos/db/

相關連結