本文來自網易雲社區
作者:孫有軍
前言
目前同步開發有好幾個項目,有的採用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 在網易雲中的落地優化實踐