repo和Git的關係 [轉載]
原文連結版權宣告:https://blog.csdn.net/qugename/article/details/57463951
任何一個學習Android開發的開發者如果想要深入學習Android,一定要看Android原始碼,網上關於下載Android原始碼的教程有很多,如果你已經翻牆了,你可以直接參考Google官網的教程或者老羅最新出的教程,如果你還沒有翻牆,你可以用清華大學的Android原始碼映象。
我一開始沒有用他們所推薦的Ubuntu下載,而是在聽聞Windows 10專業版裡內建了一個Ubuntu子系統以後,我嘗試用Windows 10下載原始碼,但遇到很多問題,在網上又搜不到相應的解釋,而且repo這個東西搞得我很混亂,完全不知道是個啥,後來公司內部也開始切換到repo和git了,才漸漸搞懂兩者的關係,也“成功”在Windows 10 下載了Android 原始碼。
Git作為一個版本控制工具,功能很強大,新建分支,切換分支都很快,小團隊用Git就能很好地管理好了,但如果是Android系統如此龐大的工程呢,我們知道全套Android原始碼是很大很大的,目錄結構也很複雜,如果直接將其init成一個Git庫,簡直是災難,也不符合解耦的要求。
Android Source
要知道Git是無法將整個庫中間的某個目錄單獨clone出來的,這樣如果我只是負責frameworks的,但我下程式碼的時候卻得把整個都下下來。
那怎麼辦呢,很簡單,分模組嘛,比如就把根目錄下的每個目錄當做一個單獨的Git庫,這樣開發只要專注於自己的模組就行,其他模組的程式碼就當看不見。嗯,很好,問題似乎解決了。但這樣還不夠,你總得有一套完整的Android 原始碼才能編譯出一個版本吧,你怎麼知道這個大版本里包含了哪個庫呢,有人會說,為啥要記錄呢,不就這麼些庫嘛,依次取出來不就行了。或許對於我們工作中接觸到的工程規模來說,這樣是夠了,但Android,都已經7.1.1了,相比較一開始,Android本身也發生了翻天覆地的變化,有些模組在演進過程中可能就漸漸被拋棄了,這個時候我們就需要一個定義一個檔案去記錄每一個版本的Android到底用了哪些庫。
以上其實就是repo的原理和所解決的問題,讓我們來看看repo到底是做的。
當你完成了repo init以後,你會在你的目錄下發現一個.repo的隱藏目錄,進到.repo/manifest/中,開啟default.xml,這就是之前所說的用來記錄一個版本中需要哪些庫的檔案。下圖是android-4.0.1_r1版本所對應的default.xml檔案:
repo/default.xml
仔細看看,是不是很熟悉?但Google分模組分的更細一些,並不是簡單地將一級目錄直接就劃成一個模組,比如external,它是以二級目錄劃分的,而device目錄下劃分得更細一些。而revision定義的則是對應庫的對應分支。
好了,這個檔案看完關閉之後,我們在.repo/manifest/目錄下執行git branch -a來看看。
這裡寫圖片描述
這下就明瞭了吧,這個manifest目錄本身其實也是一個git庫,一個Android版本對應一個分支,其中的default.xml就記錄著這個版本所需要的庫,repo工具再根據這個檔案去把取各個庫的對應分支並最終組合起來。
總結一下,Git管理單獨的模組,而repo管理所有的Git庫,將多個Git庫組合在一起,形成一個完整的大版本。
用Windows 10下載原始碼遇到的問題
下載到最後會出現如下的錯誤提示:
~/repo init -u https://android.googlesource.com/platform/manifest
~/repo sync
…
Fetching projects: 100% (512/512), done.
Syncing work tree: 59% (303/512) error: unable to create file tests/P_str_escape/str\escape.rs (No such file or directory)
Traceback (most recent call last):
File “/root/android/.repo/repo/main.py”, line 531, in
_Main(sys.argv[1:])
File “/root/android/.repo/repo/main.py”, line 507, in _Main
result = repo._Run(argv) or 0
File “/root/android/.repo/repo/main.py”, line 180, in _Run
result = cmd.Execute(copts, cargs)
File “/root/android/.repo/repo/subcmds/sync.py”, line 769, in Execute
project.Sync_LocalHalf(syncbuf, force_sync=opt.force_sync)
File “/root/android/.repo/repo/project.py”, line 1247, in Sync_LocalHalf
self._InitWorkTree(force_sync=force_sync)
File “/root/android/.repo/repo/project.py”, line 2393, in _InitWorkTree
raise GitError(“cannot initialize work tree”)
error.GitError: cannot initialize work tree
root@localhost:~/android#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
這個問題已經確認是Windows 10 bash的一個問題,不過我估計一時半會兒是沒轍了。原因其實很簡單,仔細看看“tests/P_str_escape/str\escape.rs”這個檔名,你在Windows系統下見過這麼奇怪的檔名嗎?因為Windows系統根本就不支援這樣的檔名,\/:*?”<>|這幾個字元在Windows下是不能出現在檔名當中的。連線中還提供了一種方法,在/home/usr_name/目錄下下載原始碼,但我C盤沒那麼大空間了,我就沒試,有條件的同學可以試試。
難道在Windows下我就下不了原始碼了嗎?!其實放寬點條件,還是可以的,只要你不需要編譯系統,只是想看看原始碼,還是可以的。既然那幾個檔案建立不了,那我不下了還不行嘛,不能因小失大嘛。
首先執行repo sync –trace,這樣下次出錯的時候你就能知道出錯的那幾個檔案屬於哪個模組,然後到.repo/manifest/default.xml中將對應的模組刪掉就好了,這樣一個約等於完整的原始碼就能下到本地了,只是用作研究,看一看是沒有問題的。可以看到我去掉了三個模組,這三個模組暫時和我研究的方向還沒有關係,就先這樣吧 (:з」∠)
diff
相關文章
- 【轉】QPS和併發數的關係
- git、github、gitlab之間的關係GithubGitlab
- 修改 git repo 歷史提交的 authorGit
- repo管理git倉庫——回退版本Git
- Intelligent Enterprise 和企業數字化轉型的關聯關係Intel
- 「轉載」成功的 Git 分支模型Git模型
- pcl::PointCloud和pcl::PontCloud::Ptr之間的關係和轉換方式Cloud
- git repo程式碼部署策略及工具Git
- jre 和 jdk的關係JDK
- @SpringBootApplication和@SpringBootConfiguration的關係Spring BootAPP
- PassEncoder和Pipeline的關係
- ThymeleafViewResolver和SpringTemplateEngine和SpringResourceTemplateResolver的關係ViewSpring
- (轉)git中關於fetch的使用Git
- 關係錶轉dooris 的java 指令碼Java指令碼
- 程式和產品的關係
- flink jobmanager和taskmanager的關係
- 矩陣:橫向關係和縱向關係矩陣
- session和cookie關係SessionCookie
- Google Git-Repo 多倉庫專案管理GoGit專案管理
- iOS 中 UIView 和 CALayer 的關係iOSUIView
- IP地址和MAC地址的關係Mac
- cmsis和各種庫的關係
- HomeAssistantOS和docker的組織關係Docker
- 談談 JDK 和 SAPMachine 的關係JDKMac
- Python和人工智慧的關係Python人工智慧
- [轉載]GIt命令一覽表Git
- 關係型資料庫和非關係型資料庫的區別資料庫
- (轉載)git pull origin master與git pull --rebase origin master的區別GitAST
- Cookie 和 Session 關係和區別CookieSession
- http中session和cookie的區別和關係HTTPSessionCookie
- NIO中SelectionKey和Channel、Selector的關係
- 徹底搞懂Object和Function的關係ObjectFunction
- 理解JavaScript中BOM和DOM的關係JavaScript
- Docker——理解好映象和容器的關係Docker
- ERP和MES:互補的夥伴關係
- 聊聊人工智慧和Python的關係人工智慧Python
- Window, WindowManager和WindowManagerService之間的關係
- Angular Ngrx 裡 Store 和 State 的關係Angular