天天看點

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 在網易雲中的落地優化實踐