公司內部本來使用 SVN 進行版本控制,但隨着 Github 的流行我我的的代碼管理習慣逐漸轉變。雖然公司項目並不是開源,SVN 所具備的標準 trunk / branches / tags 結構徹底夠用,使用 Git 仍然有以下優點:git
權衡後我決定花時間進行代碼倉庫的遷移。代碼遷移並不是簡單地建立 Git repo 把當前項目代碼一次性 commit 過去就夠了,由於 SVN 中存有終年累月的 commit 歷史記錄,丟失歷史記錄將對從此追溯 debug 形成很是大的麻煩,因此如何保留 commit 記錄就是遷移的關鍵。web
建立用戶映射 (例如 users.txt
) ,將 SVN 用戶和 Git 用戶對應起來:服務器
user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
…網絡
若是上面的文件中有用戶缺失,後面的 SVN 命令將會中止。不過你能夠更新用戶映射而後接着再來(相似斷點續傳)。框架
如今從 SVN 倉庫中拉取全部數據:wordpress
git svn clone --stdlayout --no-metadata -A users.txt svn://hostname/path dest_dir-tmp |
這個命令將會在 dest_dir-tmp
新建一個 Git repo,並開始從 SVN 中拉取代碼。請注意 「--stdlayout
」 參數表示你的項目在 SVN 中是常見的 「trunk/branches/tags
」 目錄結構,若是不是,那你須要使用 --tags
, --branches
, --trunk
參數(請經過 git svn help
自行了解)。svn
再後面的參數是 SVN 的地址,一些常見協議都是支持的 : svn://
, http://
, https://
. 注意這個 URL 應該指向項目的 base repository,例如 http://svn.mycompany.com/myrepo/repository
. 不要指到了 /trunk
, /tag
或 /branches
裏。工具
若是出現用戶名沒找到,更新你的 users.txt
文件,而後gitlab
cd dest_dir-tmp git svn fetch |
若是你的項目很是大,你可能須要重複上面的命令好幾回,直到全部的 SVN commit 都被抓下來了:fetch
git svn fetch |
完成後,Git 將會 checkout SVN 的 trunk 到一個新的 Git branch,而其餘的 SVN branch 將會設爲 Git remote,你能夠查看全部的 SVN branch:
git branch -r |
若是你想在你的 Git repo 中保留其餘的 remote branch,你須要手動建立本地 branch。不然,SVN 的 branch 將不會在最後被 clone。
git checkout -b local_branch remote_branch
# it's ok if local_branch and remote_branch are the same name |
SVN tags 被看成 branch 導入了,你須要建立本地 branch,打一個 tag,而後刪掉那個 branch,這樣纔會在 Git 中生成 tag。例如 SVN tag 「v1」:
git checkout -b tag_v1 remotes/tags/v1 git checkout master git tag v1 tag_v1 git branch -D tag_v1 |
把上面的 GIT-SVN repo Clone 到一個全新的乾淨 git repo:
git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir |
以前從 remote branch 建立的本地 branch 又會在新 clone 的 repo 中成爲 remote branch,因而對每一個 branch 再作一次:
git checkout -b local_branch origin/remote_branch |
最後,從乾淨的 Git repo 中刪掉 remote (指向咱們剛剛已經刪掉的 temp repo)
git remote rm origin |
這樣一個全新 Git repo 就已經從 SVN 遷移好了。
將本地的 Git repo push 到遠程倉庫(我這裏用的是 GitLab):
git remote add origin git@git.udev.hk:udba/udba.git
git push -u origin master |
push 全部的 branch:
git push origin --all |
push 全部的 tag:
git push origin --tags |
最後再放兩張 GitLab 的截圖
在線閱讀代碼
圖形化統計數據
– EOF –