實際操做 Svn 遷移到 Git

最近把一個開發了好久的項目從公司的 svn 服務器遷移到 GitLab 上,折騰了幾天。咱們的 svn 目錄結構不是很標準,因此網上的資料沒一個可以照搬用的。Anyway,最後成功了,我這裏詳細記錄一下,供參考。html

本文地址:http://www.javashuo.com/article/p-ymryvlxt-ko.htmljava

Reference

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 代碼庫狀況

咱們的 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

導出 svn 工程

首先,咱們須要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

須要注意的有三點:

  1. 除了trunk單詞是單數以外,其餘的選項單詞,請注意是複數。前者就是主分支的目錄了,然後者表示的則是對應各個分支 / 標籤的上層目錄。Git-svn 會將該目錄下的全部子目錄視爲一個獨立的分支 / 標籤進行導出。
  2. 這幾個選項指定的都是相對路徑,相對於你在git svn clone後面緊跟着的路徑的位置。因此請不要在這些選項裏面指定諸如 「http://」 開頭的絕對地址。
  3. 除了 trunk 以外,其餘幾個相關選項能夠重複指定。若是你的分支 / 標籤分別在 svn 目錄上的不一樣文件夾下,能夠屢次指定。

因而,對應咱們的實際狀況,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 上的分支命名規則未必是一致的,所以這個時候你會想要從新命名分支。個人建議是這麼操做:

  1. 在這個倉庫中,首先把這幾個虛擬的遠程分支 checkout 到本地保存下來,這樣能夠保存 change log
  2. 向服務器上傳主分支,通常分支名就是 master
  3. 將複製出來的其餘分支,推到 git 服務器上,按照你但願的規則進行命名

上傳到 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 版本控制了目錄。

相關文章
相關標籤/搜索