最近把一個開發了好久的項目從公司的 svn 服務器遷移到 GitLab 上,折騰了幾天。咱們的 svn 目錄結構不是很標準,因此網上的資料沒一個可以照搬用的。Anyway,最後成功了,我這裏詳細記錄一下,供參考。html
本文地址:http://www.javashuo.com/article/p-ymryvlxt-ko.htmljava
SVN 遷移到GIT
svn遷移到Git
SVN遷移到Git的過程(+ 一些技巧)
git-svn 使用環境和步驟
git如何恢復本地刪除的文件
git alternatives to 「svn info」 that can be included in a build for traceability?
svn2git
爲git配置擴展命令
SVN、GIT生成版本號
git使用規範
Git 添加空文件夾的方法
轉:批量查找空文件夾並放置.gitkeep或.gitignore
git add --all 爲啥不能添加空文件夾,這樣設計的初衷是?
git 爲什麼不能添加空文件夾?
Git 裏面的 origin 到底表明啥意思?
新手請教:Git 裏面的 origin 到底表明啥意思?
git 查看分支 以及所對應的remote
.gitignore 不起做用
git 放棄本地修改更新
git 提交到本地但未push到遠端的代碼
Git 分支管理和衝突解決
git cherry-pick合併某個commit
Git錯誤non-fast-forward後的衝突解決
Git下的衝突解決
Git學習筆記05--git stashlinux
看了好多資料……ios
咱們的 svn 代碼庫的 URL 固然是機密啦。不過大體原理上,我須要遷移的目錄情況以下:git
主分支(在 git 上應成爲 master 分支):
http://rdsvn.company.net/some_mid_path/Branches/maingithub
此外打了幾個tag:
http://rdsvn.company.net/some_mid_path/Branches/main_tag_25189
http://rdsvn.company.net/some_mid_path/Branches/main_tag_28141
http://rdsvn.company.net/some_mid_path/Branches/main_tag_28576segmentfault
首先,咱們須要git-svn
:服務器
$ sudo yum install git-svn or $ sodu apt-get install git-svn
原理上,就是使用git svn clone ...
命令。若是你只是簡單的執行這個命令的話:ide
$ git svn clone http://rdsvn.company.net/some_mid_path/Branches/main
那麼咱們只是將主分支及其 log 取到了本地,可是其餘的分支並無。若是要把全部的分支都 checkout 出來的話,須要用到--trunk
、--tags
、--branches
等選項。svn
須要注意的有三點:
trunk
單詞是單數以外,其餘的選項單詞,請注意是複數。前者就是主分支的目錄了,然後者表示的則是對應各個分支 / 標籤的上層目錄。Git-svn 會將該目錄下的全部子目錄視爲一個獨立的分支 / 標籤進行導出。相對路徑
,相對於你在git svn clone
後面緊跟着的路徑的位置。因此請不要在這些選項裏面指定諸如 「http://」 開頭的絕對地址。因而,對應咱們的實際狀況,git-svn 命令是這樣的:
git svn clone http://rdsvn.company.net/some_mid_path/ \ # 注意這裏並無把主分支的路徑寫完整 --trunk="Branches/main" --tags="Branches"
稍等一下子,就能夠看到整個 svn 的主分支及分支都被導出來了,一顆賽艇!
執行git branch -a
能夠看到相應的分支已經按照咱們指定的選項創建起來了。個人實際狀況,分支是這樣的:
trunk tags/main_tag_25189 tags/main_tag_28141 tags/main_tag_28576
這幾個分支都被視爲 Git 的遠程分支,你的本地倉庫暫時是空的。可使用git checkout -b ...
來將這幾個分支拉到本地。
講道理,svn 上的分支命名和 git 上的分支命名規則未必是一致的,所以這個時候你會想要從新命名分支。個人建議是這麼操做:
首先要在 git 服務器上建立一個空的工程,好比 「git@rdgit.company.net/some_mid_path/some_group/firmware.git」
而後在本地倉庫中執行:
git remote add origin git@rdgit.company.net/some_mid_path/some_group/firmware.git
而後將主分支上傳:
git push origin trunk:master
其餘的分支也是利用這個語句建立新分支上傳。
完成以後,在 git 服務器上就能夠看到完整的 change log 以及分支變化狀況啦。
其實遷移的時候還須要注意一個問題,那就是 svn 支持空目錄的版本控制,可是 git 不支持。
導出 svn 以後,最好對比一下原始的 svn 工程內是否有空目錄。若是有,那麼你須要手工(或者寫腳本)在導出的 git 工程中建立這些目錄,而且在目錄中創建一個 「.gitkeep
」 文件(這是約定俗成的作法),而且將這些文件git add .gitkeep
,以加入 git 的版本控制。這樣就以迂迴的方式經過 git 版本控制了目錄。