使用 Atlassian 轉換實用程式從 SVN 遷移到 Git

此處下載 Atlassian 轉換實用程式。此實用程式需要 Java,因此請確保在計劃進行轉換的計算機上安裝了 Java Runtime Environment JRE

使用命令 java -jar svn-migration-scripts.jar verify 檢查你的機器是否缺少完成轉換所需的任何程式。具體來說,此命令檢查 Git,subversion 和 git-svn 實用程式。它還會驗證你是否在區分大小寫的檔案系統上執行遷移。應該在區分大小寫的檔案系統上遷移到 Git,以避免破壞儲存庫。

接下來,你需要生成一個 authors 檔案。Subversion 僅通過提交者的使用者名稱跟蹤更改。但是,Git 使用兩條資訊來區分使用者:真實姓名和電子郵件地址。以下命令將生成一個文字檔案,將 subversion 使用者名稱對映到它們的 Git 等價物:

java -jar svn-migration-scripts.jar authors <svn-repo> authors.txt

其中 <svn-repo> 是你要轉換的 subversion 儲存庫的 URL。執行此命令後,貢獻者的標識資訊將對映到 authors.txt。電子郵件地址的格式為 <username>@mycompany.com。在 authors 檔案中,你需要手動將每個人的預設名稱(預設情況下已成為其使用者名稱)更改為其實際名稱。在繼續之前,請務必檢查所有電子郵件地址的正確性。

以下命令將 svn repo 克隆為 Git:

git svn clone --stdlayout --authors-file=authors.txt <svn-repo> <git-repo-name>

其中 <svn-repo> 與上面使用的儲存庫 URL 相同,<git-repo-name> 是當前目錄中用於克隆儲存庫的資料夾名稱。使用此命令之前有一些注意事項:

  • 上面的 --stdlayout 標誌告訴 Git 你正在使用 trunkbranchestags 資料夾的標準佈局。具有非標準佈局的 Subversion 儲存庫要求你指定 trunk 資料夾,any / all branch 資料夾和 tags 資料夾的位置。這可以通過以下示例來完成:git svn clone --trunk=/trunk --branches=/branches --branches=/bugfixes --tags=/tags --authors-file=authors.txt <svn-repo> <git-repo-name>
  • 此命令可能需要數小時才能完成,具體取決於你的倉庫的大小。
  • 為了減少大型儲存庫的轉換時間,可以直接在託管 subversion 儲存庫的伺服器上執行轉換,以消除網路開銷。

git svn clone 將 subversion 分支(和 trunk)作為遠端分支匯入,包括 subversion 標記(以 tags/為字首的遠端分支)。要將這些命令轉換為實際的分支和標記,請按照提供的順序在 Linux 計算機上執行以下命令。執行它們後,git branch -a 應顯示正確的分支名稱,git tag -l 應顯示儲存庫標記。

git for-each-ref refs/remotes/origin/tags | cut -d / -f 5- | grep -v @ | while read tagname; do git tag $tagname origin/tags/$tagname; git branch -r -d origin/tags/$tagname; done
git for-each-ref refs/remotes | cut -d / -f 4- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/origin/$branchname"; git branch -r -d "origin/$branchname"; done

從 svn 到 Git 的轉換現已完成! 只需將你的本地倉庫傳送到伺服器,你就可以繼續使用 Git 進行貢獻,並從 svn 獲得完全保留的版本歷史記錄。