????最近在公司被git搞到頭大,網(wǎng)上的教程都是速成的缅帘,只能入門,達不到實際開發(fā)需求难衰。比如現(xiàn)在的項目的代碼庫達到了幾百個GB钦无,從03年到現(xiàn)在不知道更迭了多少次,一個工程下面又分了幾十個repo盖袭,這些都需要被git管理失暂。在github上自己建一個repo自己玩是很難掌握git的實用開發(fā)技巧的彼宠。今天在這里開一個專欄,專門記錄開發(fā)過程中遇到的有關代碼管理難題弟塞,過于基礎的技巧不會在這里出現(xiàn)凭峡。
管理工程中的多個代碼庫
????實際開發(fā)中往往在一個工程中包含多個不同的領域,例如有的人維護內(nèi)核代碼决记,有的人編寫驅(qū)動摧冀,有的人維護uboot,等等等系宫。所以可以將這些獨立的工作用不同的倉庫管理索昂,開發(fā)人員只需要關注自己的領域的倉庫就可以了,但是整個項目建一堆倉庫又難以管理扩借,因此git可以創(chuàng)建一個manifests來統(tǒng)一管理所有子倉庫楼镐。
????以android12工程為例,android下面的.repo子目錄用來統(tǒng)一管理所有子倉庫往枷,
cd .repo/manifests/
ls -a
????可以看到框产,manifests也是一個倉庫,當前在imx_android-12.0.0_1.0.0的loacl brach上错洁,它track的是遠程branch是origin/imx_android-12.0.0_1.0.0秉宿,
vim default.xml,這個文件描述了所有子倉庫track的遠程branch
repo sync失敗原因分析
? ? 1屯碴、例如uboot-imx倉庫描睦,該倉庫管理著uboot有關的代碼,本地track的遠程branch就是refs/tags/android-12.0.0_1.0.0导而,repo sync命令做的事情就是對所有的本地branch做一次rebase忱叭,但是只能rebase到default.xml中描述的遠程分支上,如果用戶在自己的本地倉庫創(chuàng)建了local branch今艺,并且該local branch所track的remote branch與default.xml中的描述不一致韵丑,repo sync就會報錯,因為我們無法將local branch rebase到其他分支上虚缎,勢必會引發(fā)conflict撵彻。在repo sync之前應該git branch -D所有無關local branch。
? ? 2实牡、如果我們沒有在本地創(chuàng)建過其他branch陌僵,在本地的修改也會引發(fā)repo sync失敗,因為本地存在未commit的修改是無法rebase的创坞,最好的辦法是保存好本地的修改之后checkout local branch碗短。
? ? 3、有時候我們明明沒有動過某個repo题涨,但是repo sync依然報告這個repo無法sync偎谁,筆者目前還搞不懂為什么會這樣奔坟,盲猜是default.xml文件的問題。對于這種問題需要刪除一些.repo下的文件