將專案從 SVN 搬到 Git

公司還是有舊的專案是放在 Subversion(SVN) 中,為了接下來增加一些 CI/CD 的輔助,並且希望在 Teams 能夠集中並且即時的收到專案的資訊,就必須要做搬移的動作。

之前有做過一次,今天在做的時候又有點卡關,一定是沒有做筆記的原因!!

SVN 問題

SVN 也有 hooks 可以發通知之類的,公司就有在 hooks 檢查 message 的格式,把 commit 的資訊推到專案管理的平台。但有點美中不足的地方是,hooks 的設定必須進去 server 然後寫 bat 之類的程式,也就是說這個設定對於新建立專案的人來說並不友善。

第二點就是 branch 的管理,每個資料夾只能同步到其中一個 branch ,如果同時有 master 和 develop,就必須要開兩個資料夾來存放,這對於開發人員真的是一個很不方便的事情。(也許可以用一個資料夾做到,如果知道的人可以跟我分享喔)

最後一點應該就是集中式管理,同事會常常要出差到客戶那,或是 VPN 到客戶的環境中作業,這時候將專案放在公司的 SVN server 上,那就會很痛苦要一直切換網路環境。

搬移

環境準備

電腦應該要安裝好以下這幾個軟體已經被安裝,並且開啟 terminal

作業系統為 window 10

取得所有作者資訊

Git 和 SVN 對於作者描述的方法不同,第一步就要先把 SVN 的作者資訊做轉換。

Subversion users
SVN users reference from MS

Git users
Git users reference from MS

從 PowerShell (建議使用 version 7) 執行以下的指令,會將作者資訊存到檔案 authors.txt,格式會是像 jiaming = jiaming <jiaming> 這樣,開啟檔案將 <> 中的內容修改成 email 格式。

這邊要特別注意一下,檔案的編碼必須是 UTF8 (不能有 bom),不然下一個步驟 clone 時會有找不到 author 的錯誤。

1
svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} <{0}>" -f ($_ -split ' \| ')[1] } | Select-Object -Unique | Out-File -Encoding UTF8 'authors.txt'

使用 git-svn 複製

接著就要將 svn 的專案轉換成 git,先在目前的專案目錄底下建立一個子目錄 gitsource ,並且執行指令。

如果只有一個主幹,那直接 git svn clone 就好

1
git svn clone [svn repo] -A authors.txt ./gitsource

若專案是標準的 trunk/branch/tag ,那就可以加上 --stdlayout 來描述

1
git svn clone [svn repo] -A authors.txt ./gitsource --stdlayout

如果 history 很多的話,就會跑比較久一點,建議就是先放著讓他跑,做其他事情去XD

轉換 ignore

SVN 也有自己的 ignore 設定,可以透過指令轉換成 .gitignore。

如果是 dotnet 可以參考這兩個 ignore 設定,for corefor vs

1
2
3
4
cd gitsource
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'convert svn:ignore to .gitignore'

推到遠端

呼~終於到最後一步啦!! 接著就是照平常 push 到遠端的作法,就可以了

1
2
git remote add origin [git repo]
git push -u origin --all

Reference