svn倉庫分模塊遷移到git倉庫

編寫目的

公司要求將現有svn服務器上的項目全部遷徙到gitlab服務器上由運維部門統一管理。剛開始也是網上找資料,網上關於這方面文章非常多,找了幾篇比較寫的詳細文章按照步驟一步一步做,最後都沒有成功,主要原因網上文章都是很早之前寫的,有些命令在新版git上面運行出錯,另外我們的項目很大,裏面包含很多個子模塊,由不同開發部門人員開發和維護,以前svn只需要開放對應目錄給相關部門開發人員即可,現在如果不拆分出來就要把整個項目權限放開,非常不安全。經過自己大量摸索,找到一條行之有效的方法,現記錄下來提供給需要的人蔘考下。

本文包括項目整體遷徙和按模塊遷徙兩個部分,如果不需要按模塊遷徙後面部分可以忽略。

第一部分 項目從svn遷徙到git倉庫

  1. 獲取svn倉庫代碼提交者信息
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
  1. 修改提交者郵箱地址
    打開authors-transform.txt文件,修改括號裏面內容爲郵箱地址,如:
    修改前:VisualSVN Server = VisualSVN Server <VisualSVN Server>
    修改後:VisualSVN Server = VisualSVN Server <[email protected]>

  2. 獲取SVN倉庫文件過濾配置信息

git svn show-ignore --id=origin/trunk > .gitignore
  1. 用git命令克隆svn項目(可能需要安裝git-svn)
git svn clone https://192.168.1.252/svn/project-repo/ --no-metadata --trunk=trunk --tags=tags --branches=branches --A authors-transform.txt --no-minimize-url [-r72:HEAD]
#參數–no-metadata表示阻止git導出SVN包含的一些無用信息
#參數–authors-file表示SVN賬號映射到git賬號文件,所有svn作者都要做映射(這裏使用-A 指定)
#參數–trunk表示主開發項目
#參數–branches表示分支項目
#參數-r表示版本  例如上述-r72:HEAD表示從之前svn項目的版本72以後的開始同步,包括內容和commit日誌,如果要所有的svn記錄都同步則改爲-r2:HEAD(不過此時會比較耗時,因此建議按需設置)
  1. 創建本地分支,不要帶–track(下面命令執行出錯的話可能是跟蹤的遠程分支名字不對,git克隆的svn倉庫跟蹤別名和git遠程倉庫不一樣,可以試試直接用commit id或者tortoise工具創建)
git show-ref
git  checkout -b br1 origin/br1
git  checkout -b br2 origin/br2

第六步 向本地git倉庫對應分支分別添加.gitignore和readme文件。如果不需要拆分子模塊分別推送到不同git倉庫,到這一步就可以本地倉庫基本好了,後面就是遠程創建一個空倉庫,本地倉庫push到遠程的空倉庫即可。

git add .
git commit -m "add git config file." .
git remote add github-repo-name [email protected]/github-repo-name
git push -u github-repo-name --all 

第二部分 svn分模塊轉存到git倉庫

該部分內容包括創建子模塊倉庫和git項目跟蹤到創建子模塊倉庫兩塊。

從svn子目錄創建git子模塊倉庫的兩種方式

兩種方式相同點是一次只能創建一個分支的子模塊,項目有多少個分支需要重複做多少次。創建好子模塊分支後,按分支一個一個推送到遠程git子模塊倉庫。

第一種方式

重新到svn倉庫克隆子模塊目錄代碼到本地,方法和上面克隆倉庫一樣,只需要把svn地址指向具體分支的子模塊,這種方式一次只能拉取一個分支的子模塊。推薦這種方式,步驟簡單不容易出錯。

第二種方式

在同步好的本地git倉庫創建分支提取出子模塊代碼,創建好的子模塊分支只對應整個項目的單個分支,項目存在多個分支需要到每個分支上創建子模塊分支提取子模塊代碼。這種方式也有兩種操作方法對應

  1. 方法一適用於svn提交代碼都是分模塊提交,如果一次提交多個模塊,這樣導出來的子模塊攜帶有其他子模塊代碼,還有單獨去刪除。
cd REPOSITORY-NAME
git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME  BRANCH-NAME 
  1. 方法二簡單些,創建的子模塊分支幹淨,提交信息不包含其他模塊跟蹤文件
cd lib-repo
git subtree split --prefix=lib -b split
git push ~/lib-repo split:master

git項目跟蹤到子模塊倉庫

  1. git子模塊倉庫創建好之後,把克隆好的git本地倉庫對應分支下面的子模塊目錄刪除,然後添加子模塊引用。這裏假設上面子模塊路徑爲“src/submodule_folder”,創建好的遠程子模塊倉庫爲“[email protected]:account/sub-repo.git”。
git rm -r src/submodule_folder
git commit -m "remove submodule forlder." .
git submodule add -b master --name sub-origin-master [email protected]:account/sub-repo.git src/submodule_folder
git commit -m "add submodule 'sub-origin-master'." 
  1. 切換到分支重複上一步操作
git checkout br1
git commit -m "remove submodule forlder." .
git submodule add -b br1 --name sub-origin-br1 [email protected]:account/sub-repo.git src/submodule_folder
git commit -m "add submodule 'sub-origin-br1'." 
  1. 把所有子模塊都添加進去之後,再把項目推送到遠程空倉庫就可以了。

參考鏈接

https://blog.csdn.net/furzoom/article/details/90606302

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章