爲什麼要從SVN遷移到Git?

如果你還在使用集中式版本控制工具SVN,可能已經感受到它的侷限:每次提交都需要聯網,分支管理不夠靈活,團隊協作時代碼衝突頻繁。而Git作爲分佈式版本控制工具,支持本地完整版本庫、多分支並行開發、離線操作等優勢,能極大提升團隊效率。本文將手把手教你從SVN倉庫遷移到Git,適合零基礎的Git初學者。

一、準備工作

在開始遷移前,需要完成以下準備:

  1. 安裝必要工具
    - 安裝Git:Windows用戶可從Git官網下載安裝;Mac用戶用Homebrew brew install git;Linux用戶用系統包管理器(如Ubuntu sudo apt install git)。
    - 安裝SVN工具:如果SVN倉庫未本地安裝,需額外安裝(Ubuntu sudo apt install subversion,Mac brew install subversion)。
    - 安裝svn2git工具(推薦):用於將SVN歷史轉換爲Git格式。通過RubyGems安裝:gem install svn2git(需先安裝Ruby,Windows用戶可通過RubyInstaller安裝)。

  2. 創建Git遠程倉庫
    在GitHub、GitLab或Gitee等平臺新建一個空倉庫(如命名爲my-project),記住倉庫地址(如https://github.com/your-username/my-project.git或SSH地址git@github.com:your-username/my-project.git)。

  3. 配置Git身份
    確保Git提交時的用戶信息與遠程倉庫一致:

   git config --global user.name "你的名字"
   git config --global user.email "你的郵箱"

二、遷移步驟(以GitHub爲例)

假設你的SVN倉庫地址爲https://svn.example.com/svn/project,目標是遷移到新建的Git倉庫。

步驟1:導出SVN倉庫歷史

使用svn2git工具將SVN倉庫轉換爲Git格式,保留完整歷史:

# 進入項目目錄(建議先新建空目錄)
mkdir git-migrate && cd git-migrate

# 執行轉換命令,替換SVN倉庫地址
svn2git https://svn.example.com/svn/project --trunk=trunk --branches=branches --tags=tags --authors=authors.txt
  • --trunk=trunk:指定SVN的主分支路徑(通常對應Git的master分支)。
  • --branches=branches:指定SVN的分支目錄(對應Git的branches/xxx)。
  • --tags=tags:指定SVN的標籤目錄(對應Git的tags/xxx)。
  • --authors=authors.txt:(可選)映射SVN作者到Git作者。若SVN作者與Git用戶信息一致,可省略此參數。

步驟2:處理作者信息(可選)

如果SVN作者與Git用戶信息不同,需創建authors.txt文件映射,格式爲:

svn_old_author = Git 用戶名 <Git 郵箱>

例如:

bob = Bob Smith <bob@example.com>
alice = Alice Wang <alice@example.com>

然後在svn2git命令中加入--authors=authors.txt參數。

步驟3:推送本地Git倉庫到遠程

轉換完成後,進入生成的Git倉庫目錄(默認名爲項目名),推送內容到遠程倉庫:

cd project
git remote add origin https://github.com/your-username/my-project.git  # 替換爲你的Git倉庫地址
git push -u origin --all  # 推送所有分支(包括trunk、branches)
git push -u origin --tags  # 推送所有標籤
  • -u origin:設置origin爲默認遠程倉庫,後續git push可省略origin
  • --all:推送所有本地分支到遠程。
  • --tags:推送所有標籤。

步驟4:驗證遷移結果

遷移完成後,檢查以下內容是否正確:
1. 分支:執行git branch -a,確認遠程分支與SVN分支對應(如remotes/origin/branches/feature-x)。
2. 歷史:執行git log --oneline,查看提交記錄是否完整(包含時間、作者、信息)。
3. 文件:打開項目文件,確認所有文件未丟失,目錄結構與SVN一致。

三、常見問題與解決

  1. 權限問題
    - 若svn2git報錯“拒絕訪問”,檢查SVN倉庫URL是否正確,且你有讀取權限。
    - 若git push時要求輸入密碼,確認SSH密鑰已配置(ssh -T git@github.com測試連接)。

  2. 提交信息不完整
    - 若轉換後的提交信息缺少作者名,需檢查authors.txt是否正確映射。

  3. 大文件導致轉換失敗
    - 若SVN倉庫含大文件(如二進制文件),svn2git可能因緩存不足報錯。此時可分批次遷移,或用git svn替代svn2git

     # 克隆SVN倉庫到Git(需Ruby環境)
     git svn clone https://svn.example.com/svn/project --stdlayout --authors-file=authors.txt
  1. 分支結構混亂
    - 若SVN分支非標準trunk/branches/tags,需手動調整:
     # 重命名主分支爲master
     git branch -m master
     # 重命名分支
     git branch -r | grep -v '->' | while read remote; do git branch --track ${remote#origin/} $remote; done

四、總結

從SVN遷移到Git的核心是利用工具保留歷史、映射分支結構,並驗證完整性。遷移後,你可以享受Git的分佈式優勢:本地開發無需聯網,分支管理更靈活,團隊協作更高效。後續可基於Git Flow等工作流規範,提升項目管理效率。

如果遷移過程中遇到複雜問題,可參考svn2git官方文檔或Git/SVN官方手冊,逐步排查錯誤。

小夜