2013/03/23

Just a Note:SVN Repository Partial Merge

先描述一下情境,目的是要將自己開發環境的 svn 轉移到客戶的 svn repository。

客戶的 svn repository 事先就建立好,且有制定好的目錄結構,我們只是將 source 放到對應的路徑下。
現行的做法是,從開發環境 checkout 出最後一版資料,然後 commit 到客戶的 svn repository,視為全新的開始,過去的歷程就一筆勾銷。
然後開發人員便將 svn reporistory 重新指到客戶的環境。
這其實也沒什麼問題,因為客戶根本不需要知道開發期間資料來來回回異動的歷程。

只是對於沒事會常常去看歷程的人來說(<-- 就是我),歷程突然都沒了(除非連回原本的 repository),其實很困擾。

是不是有什麼辦法可以在移轉後保留原本歷程呢?因此有了這篇筆記。

假設 repo1 是開發環境的 svn repository,已經有 commit 了一些資料,


而 repo2 是客戶的 svn repository,如下列圖示。

現在要把 repo1 的 trunk/ELOAN/col 中的檔案,放到 repo2 的 trunk/COL/col 下。過程會用到 svnadmin 的相關指令,意思就是,必須要能在 repo1 和 repo2 兩個 repository 實體檔案存在的機器上,才能進行以下的步驟。聽說 Subversion 1.7 之後支援 remote dump,但不確定有沒有支援 remote load。

1. Dump repo1,把完整的 repo1 dump 成檔案。
svnadmin dump repo1 > repo1.dmp

2. Filter repo1,過濾 dump 出來的檔案,只保留 col 的資料。
svndumpfilter include trunk/ELOAN/col < repo1.dmp > col_from_repo1.dmp

3. 編輯 col_from_repo1.dmp,因為 dump 出來的資料結構是 trunk/ELOAN/col/*,除非目標的 svn repository 也用相同的目錄結構,否則就需要手動調整一下 filter 後的檔案。調整的方式很簡單,col_from_repo1.dmp 是個純文字檔,只要把所有的 trunk/ELOAN/col 取代為 col 即可。

4. 把 col_from_repo1.dmp 匯入 repo2,以既有的結構,會失敗。因為 repo2 的 /trunk/COL 目錄下已經存在一個沒資料的 col 目錄。
svnadmin load --parent-dir "/trunk/COL" E:\Temp\svn\repo2 < col_from_repo1.dmp

5. 先把把 repo2 /trunk/COL 下的 col 目錄刪除。

6. 重新匯入。
svnadmin load --parent-dir "/trunk/COL" E:\Temp\svn\repo2 < col_from_repo1.dmp

7. 完成。

原本在 repo1 的 r4、r5,轉移到 repo2 的 r16、r17。

透過 svnadmin dump, filter, load,便能進行 svn repository partial merge,且可以保留原本 repository 中的歷程。

移轉後,仍有幾個衍生的議題:
1. 原本 issue tracking system 綁定的 svn repository 需更換。
2. 需手動調整原本 issue tracking system 對應的 svn revision。(可能會麻煩,但至少有一對一的對應)


沒有留言:

張貼留言