1 月 2011

在 Windows 下將 Subversion 的 repo 由 BDB 格式轉為 FSFS 格式

我用 Subversion 管理工作用的程式碼已經好幾年了,不過最近我越來越討厭它。討厭它的原因並不是因為它變得難用,而是開發團隊對於舊版本使用者表現的那種傲慢態度。

其中一個例子:我前一陣子在研究 Subversion 和 Apache 協同運作時遇到版本搭配的問題。在網路上搜尋答案,卻看到一個像是 project team 成員的人跳出來說:「你就用我們提供的、已經和 Subversion 緊密搭配的 Apache 版本就好了嘛!」問題是並不是所有人都有這樣的權限啊!(像我就是)

另一個例子就是今天這篇文章想要解決的問題。Subversion 在建立 repository 時提供兩種不同的格式讓使用者選擇:Berkley DB (BDB) 和 FSFS。早期的 TortoiseSVN 和 CollabNet 的 Subversion for Win32 都提供這兩種格式讓使用者選擇。但從 1.6.0 版開始,TortoiseSVN 突然就不支援 BDB 了!也沒有提供任何轉換的工具!請問一下:那我之前那些用 BDB 建立的 repository 怎麼辦?有一種被拋棄的感覺… 🙁

最近我開始用 Mercurial 管理我新開的專案……不過那是另外一個故事了。但舊的 repository 還是得救回來,不然之前的心血都白費了。

將 repo 由 bdb 轉成 fsfs 說起來不算太難,只要利用 svnadmin 下幾個指令就行了。但問題是:要選對 Subversion 的版本!前面說過,Subversion 沒有提供任何轉換的工具。一般人常用的的 Subversion 版本(CollabNet 和 VisualSVN 等)也都不支援 BDB (wtf –_-)!我試了好幾套,最後找到由 David Darj 維護的 Subversion for Windows 有支援 BDB(嗯… 至少 1.6.13 有支援;而且在 SourceForge 上能 download 舊版。

下載安裝就不多提了。安裝完後,先建立一個新的 repo,準備接轉出來的資料——當然,這個新的 repo 的格式要選 fsfs。你可以用 TortoiseSVN 建,或是直接利用 svnadmin create 建(假設你的 repos 都放在 D:SVN_DB;然後要轉的 repo 叫做 MyProject :

svnadmin create –fs-type=fsfs MyProject_fsfs

接著我們用 svnadmin dump 把舊的 repo 內容倒出來,再用 svnadmin load 傳進新的 repo 中:

svnadmin dump MyProject | svnadmin load MyProject_fsfs

最後我們把舊的 repo 改名、備份;用新的 repo 取代舊有的 repo:

move MyProject MyProject_old
move MyProject_fsfs MyProject

這樣應該就可以了。