目前同步開發(fā)有好幾個項目,有的采用svn管理,有的采用git管理,一想也知道svn管理的項目都比較老,每次切換工程開發(fā)都要改變提交代碼的方式。因此就打算把svn管理的項目遷移到git上,其實前面說的都不是重點,重點是svn服務(wù)器有時不穩(wěn)定,所以才打算遷移到git上。
       說干就干,問題是之前都沒有遷移過啊!這都難不倒我,有萬能的google,隨便搜索關(guān)鍵字svn遷移到git,隨便出來都是一大堆文章,看起來確實沒有幾步,那就開干吧!
很多文章上來第一步就是:
git svn clone https://xxxxx/xxxxxx/trunk/android/PRoject1 --no-metadata --authors-file=userinfo.txt --trunk=trunkprojectnamewtf? 這是啥!后面的參數(shù)都是些啥?不得已又翻下一遍找到了上面的參數(shù)的解釋:
–no-metadata: 就是拉取的時候,不需要拉取svn的metadata信息,這樣可以保證提交到git項目比較干凈 –authors-file=userinfo.txt: 表示提交的作者映射,將svn中提交記錄的作者都映射到新的名字 –trunk=trunkprojectname:表示svn上trunk分支,后面是trunk分支的名稱
這里我們首先創(chuàng)建一個txt文檔來映射所有的提交者, 格式如下:
loginname = Joe User <user@example.com>如果有多個,那就多行,不需要符號換行:
loginname = Joe User <user@example.com>loginname1 = Jone User <guest@example.com>將所有的提交者都做一次映射。那我們接著clone代碼吧!
作者映射創(chuàng)建好了,但是–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就相當(dāng)于上面三個參數(shù)的組合,還可以寫成–stdlayout
但是我clone的地址只需要遷移其中一個項目,況且我trunk下面還有好幾個項目,類似如下:
https://xxxxx/xxxxxx/trunk/android/project1https://xxxxx/xxxxxx/trunk/android/project2我只需要遷移其中的project1,這里完全不符合–trunk=trunkprojectname,這種情況又怎么辦?我是加這參數(shù)還是不加這個參數(shù)?實踐是檢驗真理的唯一方式,兩種情況我都嘗試一次,首先輸入如下的命令:
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等待許久,執(zhí)行完畢,去本地Demo文件夾一看啥都沒有,妥妥的失敗了,這里主要出現(xiàn)了兩個錯誤第一個是默認(rèn)使用了更高level的url,但是我并不想從更高的url來遷移,第二是輸出This may take a while on large repositories,最終結(jié)果就是失敗了。
我們先來解決第一個問題:
Using higher level of URL: https://xxxxxxx/branch/android/project1 => https://xxxxxxxx/branch/android       可以在命令行加入--no-minimize-url,主要是不縮小輸入的地址,加入該命令后我們繼續(xù)clone,輸入的命令變成了如下:
加入?yún)?shù)后,不會才出現(xiàn)Using higer level of URL的錯誤了,根據(jù)提交記錄的多少,這個等待時間可能是不確定的,經(jīng)過良久的等待之后,成功的出現(xiàn)了如下錯誤:
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 repositoriesURL 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參數(shù)不行,那這里就不加這個參數(shù),命令如下:
git svn clone https://xxxxx/xxxxxx/trunk/android/project1 --no-metadata --no-minimize-url --authors-file=userinfo.txt --no-minimize-url demo再一次長久的等待,真正的是好事多磨,這次終于成功了。其實在這之間還出現(xiàn)了一次錯誤,就是代碼在clone的時候,當(dāng)遷移到某一初時,出現(xiàn)了name that does not exist in the authors-files,這是是因為userinfo中未列全所有提交者。
代碼已經(jīng)clone到本地了,那之后就是push到git上去了。至于怎么在上創(chuàng)建項目啥的,這里就不在贅述了,假設(shè)這里已經(jīng)有給一個遠(yuǎn)程庫地址了,地址如下:
https://github.com/FreeSunny/TvSample.git有了遠(yuǎn)程庫地址,我們就可以將本地的工程push到遠(yuǎn)程地址,命令如下:
git remote add origin https://github.com/FreeSunny/TvSample.git關(guān)聯(lián)了地址后,最后一步就是將代碼給push上去:
git push -u origin master之后你刷新git,會發(fā)現(xiàn)已經(jīng)有了工程,不過在我這又出現(xiàn)了一次幺蛾子,怎么刷都沒有,提交日志顯示已經(jīng)成功,wtf,最后我手動改了一個文件,在提交一次,才將所有東西刷出來。
這里是一個Android項目,采用as打開后,在編譯會出現(xiàn)很多額外的文件,我們怎么才能將這些不必要的文件提交到遠(yuǎn)程吶?手動添加.gitignore文件,將要排除的文件都列入到.gitignore中。
看別人文章本來是想抄一個近道,但是花的時間更長,每個項目管理的方式不一樣,所以不是每個方法都通用,只是可氣的是,網(wǎng)上每篇文字都大同小異,難道他們的管理方式都一模一樣!!
我去搜索官方文檔,苦心人天不負(fù),官方文檔才是正道。
官方文檔地址
文章中地址都用xxx來替代了。
新聞熱點
疑難解答