svn 版本庫的遷移,隻要svn 庫為标準目錄(trunk、branches、tags)按照git官方文檔基本都可以完成。
這裡說說我所遷移的非标準目錄結構的svn 庫
svn 庫裡有part1目錄,part1目錄下又分為:code、UI等等,對于這種非标準目錄結構,主幹就是part1,沒有分支,沒有标簽。
而code下面又分為android、ios目錄,目錄内才分trunk、tags、branch,這種目錄層級結構……
對于以上非标準目錄結構,我采用的是先git svn到本地,并送出到git倉庫一個完整的版本,然後再将各目錄層級進行拆分為獨立标準目錄結構svn庫,然後再将各個庫git svn到本地,再送出到git庫。
說的可能有些繞,具體來操作下
全局假設:
原svn庫位址:file:///home/svn1/
拆分後的标準庫位址:file:///home/svn2/$svn/
原svn庫對應的git位址:https://git.example.com/dev/oldsvn.git
拆分後對應的git位址:[email protected]/dev/$svn.git
注:$svn以具體目錄或庫名命名
目錄結構:
part1:
code:
android:trunk、tags、branches
ios:trunk、tags、branches
UI
将原svn庫克隆到本地:
對于标準目錄結構含有其它自定義的目錄,也可采用此方式,隻需将trunk設定為自定義的目錄名即可
git svn clone file:///home/svn/ \
--authors-flie=users.txt --no-metadata --trunk=part1 oldsvn
選項含義:
--authors-file: 指定svn和git使用者對應關系
--no-metadata: 告訴
git svn
不要包括 Subversion 通常會導入的中繼資料
--trunk: 主幹名
注:這裡沒有tags和branches是以不加 --tags --branch選項,也不用-s 選項代替。非标準目錄結構,實際存在什麼就指定什麼,不存在不指定。
在clone過程中,可能會有含‘gc‘ 的提示,遇見則‘git gc --prune=now',然後'git svn fetch' 繼續clone
成功後,克隆的git 倉庫結構對應為:
将此送出到git 倉庫,作為舊版本庫,便于檢視原svn曆史送出修改。
git remote add origin https://git.example.com/dev/oldsvn.git
git push origin --all
對于多層級的目錄結構,如現在需要将part1:conde:ios 的庫遷移到git 上
首先,将ios 目錄拷貝到svn庫的根目錄,既與part1同級,目錄機構如下:
android:trunk、tags、branches
ios:trunk、tags、branches
UI:
這樣在通過‘git svn clone‘ 的時候,就可以指定trunk為ios了
git svn clone file:///home/svn/ \
--authors-flie=users.txt --no-metadata --trunk=ios --branch=branches --tags=tags ios
将标簽變為合适的 Git 标簽
$ cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/
$ rm -Rf .git/refs/remotes/origin/tags
這會使原來在
remotes/origin/tags/
裡的遠端分支引用變成真正的(輕量)标簽。
接下來,将
refs/remotes
下剩餘的引用移動為本地分支:
$ cp -Rf .git/refs/remotes/* .git/refs/heads/$ rm -Rf .git/refs/remotes
将你的新 Git 伺服器添加為遠端倉庫并推送到上面
git remote add origin [email protected]/dev/ios.git
git branch -r
git push origin --all
git svn clone file:///home/svn/part1/code/android \
--authors-flie=users.txt --no-metadata -T trunk -t tags -b branches android
fatal: refs/remotes/trunk: not a valid SHA1