有個外包專案,用TFS管理Code快一年,後來客戶接手回去,希望有歷程記錄,但覺得TFS 2010太貴了不想買,希望轉成SVN給他們,我就找了一下網路上的轉檔程式,雖然有不少如tfs2svn,但都只支援TFS 2008,這時我會成為Developer的理由又出來啦,沒人寫,難到我不能自己寫嗎!!就把tfs2svn的源始碼下載(Open Source真好),修修改改快一個星期,終於可以把 "這個專案" 從第一個Changeset 完整的轉到最後一千五百多個Changeset,所有的歷程都有保留,用WinMerge比較TFS與SVN的最後一個Checkout,100%相同,不過呢?當寫完熱忱好像也用完了,一點也不想把他美化與增加UI,但是呢?這個專案本來就是分享別人的成果改的,我想也應該把他分享出去,一般的TFS 2010的專案我想應該都可以轉換,不過畢竟我只測試過一個專案而以,不保證一定可以轉成功,這時如果你也是Developer就可以下載源始碼來修改。
有個外包專案,用TFS管理Code快一年,後來客戶接手回去,希望有歷程記錄,但覺得TFS 2010太貴了不想買,希望轉成SVN給他們,我就找了一下網路上的轉檔程式,雖然有不少如tfs2svn,但都只支援TFS 2008,這時我會成為Developer的理由又出來啦,沒人寫,難到我不能自己寫嗎!!就把tfs2svn的源始碼下載(Open Source真好),修修改改快一個星期,終於可以把 "這個專案" 從第一個Changeset 完整的轉到最後一千五百多個Changeset,所有的歷程都有保留,用WinMerge比較TFS與SVN的最後一個Checkout,100%相同,不過呢?當寫完熱忱好像也用完了,一點也不想把他美化與增加UI,但是呢?這個專案本來就是分享別人的成果改的,我想也應該把他分享出去,一般的TFS 2010的專案我想應該都可以轉換,不過畢竟我只測試過一個專案而以,不保證一定可以轉成功,這時如果你也是Developer就可以下載源始碼來修改。
必要環境
- TFS 2010 Server (千萬不要拿去轉TFS 2008,我保證一定會失敗的)
- SVN Server (可以先使用本機SVN的方式,處理完後,在把Repository資料夾放到Sever上,這樣比較快)
- TFS 2010 Client (VS 2010裝好通常就有了,如果沒有可以下載安裝Microsoft Visual Studio Team Explorer 2010)
- SVN Client(需要svn.exe與svnadmin.exe,可惜的是TortoiseSVN沒有,其他的Client可能有,如沒有請到此下載,我測試時是用svn-win32-1.6.6的版本)
- .Net Framework 4.0
執行說明
因為懶的寫UI,所以是一支Console程式,必要的參數都是放在Tfs2010ToSvn.Console.exe.config,請先修改config後在執行程式,這是可以分段執行的,如執行到一半發現SVN的錯誤(如已簽入成功,但有部分問題,或某檔案過期),處理完後,可以把Start Changeset改成失敗時的Changeset或是下一個的Changeset。
NOTE:
我發現在同一個Changeset下太多次子層的Move就會出現已簽入成功,但有部分問題的錯誤,如: A-Folder改成B-Folder,又將B-Folder下子資料夾F-Folder改成G-Folder,又將G-Folder下子資料夾X-Folder改成Y-Folder,雖然程式有寫重新Checkout,但有時會更新,有時會失敗,這時人工排除問題後,使用下一個Changeset再執行就可以了。
Out Of Time的問題或上一個問題,我會用SVN Client執行Revert(如Revert失敗我會全部刪除後在Checkout)與刪除unversioned files,然後在Checkout,如果還是不行,只有改程式一途。
圖一 執行畫面
注意事項
1.一開始要先建立SVN Repository(如圖二), 看要不要建立常用的資料夾如(Trunk、Tag等),然後Checkout(圖三),
圖二 建立本地SVN
圖三 Checkout
2.因為需要簽入後修改一些簽入記錄(時間與簽入人),所以在hooks下請加入pre-revprop-change.bat,想簡單的化檔案內容只要下 exit 0 就可以了。
3.有使用NLog記錄所有SVN指令,預設產出在exe的同一個資料夾下,如果其他需要請自行修改Tfs2010ToSvn.Console.exe.config。
轉換的原理
這個轉換工具沒有太高深的技巧與原理,說穿了只是將TFS的歷程在SVN上還原而以,版本管理系統會將所有檔案的新增、修改、刪除、移動都詳實的記錄,這個轉換工具只是一一的解析TFS的記錄,轉成SVN的指令執行,原本在TFS上做了什麼,就改在SVN上重新執行一次。
圖三 某Changeset的部分記錄
圖三就是TFS的歷程記錄(API呼叫請參考Extending Team Foundation),解析的方式就如下:
edit 就解析成下載TFS的檔案到SVN的Working Copy做更新。
add 就解析成下載TFS的檔案到SVN的Working Copy,並執行svn.exe add file。
delete 就解析成下載TFS的檔案到SVN的Working Copy,並執行svn.exe rm file 。
最麻煩的是rename或move,如A-Folder 改名成 B-Folder,這時TFS會產生二筆記錄。
A-Folder delete, source rename
B-Folder Rename
必需找出二個筆記錄的關聯(這我找好久喔,曾找到記錄在放DB的tbl_MergeHistory,卻不知道要呼叫那個API把資料取出來),下一個SVN的指令。
svn.exe mv A-Folder B-Folder
但如果A-Folder下有子資料夾或檔案,每一個資料夾或檔案都會產生二筆記錄,這些記錄要省略不執行SVN的指令,複合變動也很麻煩,如A-File改名成B-File,同時內容也有做更新,這時TFS還是產生二筆記錄。
A-File delete, source rename
B-File Rename, edit
更麻煩的多個檔案的Rename,如A-File改名成B-File,C-File改名成A-File,這時TFS只產生三筆記錄。
A-File edit, delete, source rename
B-File Rename
C-File delete, source rename
要解析成
svn.exe mv A-File B-File
svn.exe mv C-File A-File
除了解析成SVN的指令外,執行順序也很重要,如果順序搞錯了,結果是完全不同的呢。
雖然已經盡可能的找出情境並處理,但一定還有缺少的部分,這時就要你們自己補完他了。