SVN遷移到GIT

本文來自網易雲社區

作者:孫有軍


前言

目前同步開發有好幾個項目,有的採用svn管理,有的採用git管理,一想也知道svn管理的項目都比較老,每次切換工程開發都要改變提交代碼的方式。因此就打算把svn管理的項目遷移到git上,其實前面說的都不是重點,重點是svn服務器有時不穩定,所以纔打算遷移到git上。

遷移過程

說幹就幹,問題是之前都沒有遷移過啊!這都難不倒我,有萬能的google,隨便搜索關鍵字svn遷移到git,隨便出來都是一大堆文章,看起來確實沒有幾步,那就開幹吧!

clone代碼

很多文章上來第一步就是:

git svn clone https://xxxxx/xxxxxx/trunk/android/project1 --no-metadata --authors-file=userinfo.txt  --trunk=trunkprojectname

wtf? 這是啥!後面的參數都是些啥?不得已又翻下一遍找到了上面的參數的解釋:

--no-metadata: 就是拉取的時候,不需要拉取svn的metadata信息,這樣可以保證提交到git項目比較乾淨 --authors-file=userinfo.txt: 表示提交的作者映射,將svn中提交記錄的作者都映射到新的名字 --trunk=trunkprojectname:表示svn上trunk分支,後面是trunk分支的名稱

作者映射

這裏我們首先創建一個txt文檔來映射所有的提交者, 格式如下:

loginname = Joe User <[email protected]>

如果有多個,那就多行,不需要符號換行:

loginname = Joe User <[email protected]>
loginname1 = Jone User <[email protected]>

將所有的提交者都做一次映射。那我們接着clone代碼吧!

--trunk

作者映射創建好了,但是--trunk這個又怎麼寫?

svn是採用trunk,branches,tags來管理代碼的, 如果你的項目是完全按照trunk,branches,tags來管理的,遷移的命令可以寫作如下:

git svn clone https://xxxxx/xxxxxx/ --no-metadata --authors-file=userinfo.txt  --trunk=trunkname --branches=branches --tags=tags

也可以寫作如下:

git svn clone https://xxxxx/xxxxxx/ --no-metadata --authors-file=userinfo.txt -s
這裏的-s就相當於上面三個參數的組合,還可以寫成--stdlayout

但是我clone的地址只需要遷移其中一個項目,況且我trunk下面還有好幾個項目,類似如下:

https://xxxxx/xxxxxx/trunk/android/project1https://xxxxx/xxxxxx/trunk/android/project2

我只需要遷移其中的project1,這裏完全不符合--trunk=trunkprojectname,這種情況又怎麼辦?我是加這參數還是不加這個參數?實踐是檢驗真理的唯一方式,兩種情況我都嘗試一次,首先輸入如下的命令:

git svn clone https://xxxxx/xxxxxx/trunk/android/project1 --no-metadata --no-minimize-url --authors-file=userinfo.txt  --trunk=project1  demo

這裏的demo是項目遷移下來本地文件夾名稱,開始clone輸出如下:

Initialized empty Git repository in /Users/doc/Test/Demo/.git/Using higher level of URL: https://xxxxxxx/branch/android/project1 => https://xxxxxxxx/branch/androidW: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/xxxxxxbranch/android' path not foundW: Do not be alarmed at the above message git-svn is just searching aggressively for old history.
This may take a while on large repositories
^Cecked through r290000

等待許久,執行完畢,去本地Demo文件夾一看啥都沒有,妥妥的失敗了,這裏主要出現了兩個錯誤第一個是默認使用了更高level的url,但是我並不想從更高的url來遷移,第二是輸出This may take a while on large repositories,最終結果就是失敗了。

我們先來解決第一個問題:

Using higher level of URL: https://xxxxxxx/branch/android/project1 => https://xxxxxxxx/branch/android

可以在命令行加入--no-minimize-url,主要是不縮小輸入的地址,加入該命令後我們繼續clone,輸入的命令變成了如下:

git svn clone https://xxxxx/xxxxxx/trunk/android/project1 --no-metadata --no-minimize-url --authors-file=userinfo.txt --no-minimize-url --trunk=project1  demo

加入參數後,不會纔出現Using higer level of URL的錯誤了,根據提交記錄的多少,這個等待時間可能是不確定的,經過良久的等待之後,成功的出現瞭如下錯誤:

Initialized empty Git repository in /Users/doc/Test/Demo/.git/W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/xxxxx/branch/android/dev_tv' path not foundW: Do not be alarmed at the above message git-svn is just searching aggressively for old history.
This may take a while on large repositories
URL access forbidden for unknown reason: Access to '/xxxxxx/default' forbidden at /Applications/Xcode.app/Contents/Developer/usr/share/git-core/perl/Git/SVN.pm line 179.

既然加了trunk參數不行,那這裏就不加這個參數,命令如下:

git svn clone https://xxxxx/xxxxxx/trunk/android/project1 --no-metadata --no-minimize-url --authors-file=userinfo.txt --no-minimize-url  demo

再一次長久的等待,真正的是好事多磨,這次終於成功了。其實在這之間還出現了一次錯誤,就是代碼在clone的時候,當遷移到某一初時,出現了name that does not exist in the authors-files,這是是因爲userinfo中未列全所有提交者。

push

代碼已經clone到本地了,那之後就是push到git上去了。至於怎麼在上創建項目啥的,這裏就不在贅述了,假設這裏已經有給一個遠程庫地址了,地址如下:

https://xxxx/Sample.git

有了遠程庫地址,我們就可以將本地的工程push到遠程地址,命令如下:

git remote add origin https://xxxx/Sample.git

關聯了地址後,最後一步就是將代碼給push上去:

git push -u origin master

之後你刷新git,會發現已經有了工程,不過在我這又出現了一次幺蛾子,怎麼刷都沒有,提交日誌顯示已經成功,wtf,最後我手動改了一個文件,在提交一次,纔將所有東西刷出來。

附錄

這裏是一個Android項目,採用as打開後,在編譯會出現很多額外的文件,我們怎麼才能將這些不必要的文件提交到遠程吶?手動添加.gitignore文件,將要排除的文件都列入到.gitignore中。

後記

看別人文章本來是想抄一個近道,但是花的時間更長,每個項目管理的方式不一樣,所以不是每個方法都通用,只是可氣的是,網上每篇文字都大同小異,難道他們的管理方式都一模一樣!!

我去搜索官方文檔,苦心人天不負,官方文檔纔是正道。

官方文檔地址

文章中地址都用xxx來替代了。



網易雲免費體驗館,0成本體驗20+款雲產品! 

更多網易研發、產品、運營經驗分享請訪問網易雲社區


相關文章:
【推薦】 Kubernetes 在網易雲中的落地優化實踐

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