爲什麼要從SVN遷移到Git?¶
如果你還在使用集中式版本控制工具SVN,可能已經感受到它的侷限:每次提交都需要聯網,分支管理不夠靈活,團隊協作時代碼衝突頻繁。而Git作爲分佈式版本控制工具,支持本地完整版本庫、多分支並行開發、離線操作等優勢,能極大提升團隊效率。本文將手把手教你從SVN倉庫遷移到Git,適合零基礎的Git初學者。
一、準備工作¶
在開始遷移前,需要完成以下準備:
-
安裝必要工具
- 安裝Git:Windows用戶可從Git官網下載安裝;Mac用戶用Homebrewbrew install git;Linux用戶用系統包管理器(如Ubuntusudo apt install git)。
- 安裝SVN工具:如果SVN倉庫未本地安裝,需額外安裝(Ubuntusudo apt install subversion,Macbrew install subversion)。
- 安裝svn2git工具(推薦):用於將SVN歷史轉換爲Git格式。通過RubyGems安裝:gem install svn2git(需先安裝Ruby,Windows用戶可通過RubyInstaller安裝)。 -
創建Git遠程倉庫
在GitHub、GitLab或Gitee等平臺新建一個空倉庫(如命名爲my-project),記住倉庫地址(如https://github.com/your-username/my-project.git或SSH地址git@github.com:your-username/my-project.git)。 -
配置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一致。
三、常見問題與解決¶
-
權限問題:
- 若svn2git報錯“拒絕訪問”,檢查SVN倉庫URL是否正確,且你有讀取權限。
- 若git push時要求輸入密碼,確認SSH密鑰已配置(ssh -T git@github.com測試連接)。 -
提交信息不完整:
- 若轉換後的提交信息缺少作者名,需檢查authors.txt是否正確映射。 -
大文件導致轉換失敗:
- 若SVN倉庫含大文件(如二進制文件),svn2git可能因緩存不足報錯。此時可分批次遷移,或用git svn替代svn2git:
# 克隆SVN倉庫到Git(需Ruby環境)
git svn clone https://svn.example.com/svn/project --stdlayout --authors-file=authors.txt
- 分支結構混亂:
- 若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官方手冊,逐步排查錯誤。