天天看點

svn遷移至git

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