repo和Git的關係

2021-07-27 12:36:26 字數 2852 閱讀 6204

git作為乙個版本控制工具,功能很強大,新建分支,切換分支都很快,小團隊用git就能很好地管理好了,但如果是android系統如此龐大的工程呢,我們知道全套android原始碼是很大很大的,目錄結構也很複雜,如果直接將其init成乙個git庫,簡直是災難,也不符合解耦的要求。

要知道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檔案:

仔細看看,是不是很熟悉?但google分模組分的更細一些,並不是簡單地將一級目錄直接就劃成乙個模組,比如external,它是以二級目錄劃分的,而device目錄下劃分得更細一些。而revision定義的則是對應庫的對應分支。

好了,這個檔案看完關閉之後,我們在.repo/manifest/目錄下執行git branch -a來看看。

這下就明了了吧,這個manifest目錄本身其實也是乙個git庫,乙個android版本對應乙個分支,其中的default.xml就記錄著這個版本所需要的庫,repo工具再根據這個檔案去把取各個庫的對應分支並最終組合起來。

總結一下,git管理單獨的模組,而repo管理所有的git庫,將多個git庫組合在一起,形成乙個完整的大版本。

# ~/repo init -u 

# ~/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

ordirectory)

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#

難道在windows下我就下不了原始碼了嗎?!其實放寬點條件,還是可以的,只要你不需要編譯系統,只是想看看原始碼,還是可以的。既然那幾個檔案建立不了,那我不下了還不行嘛,不能因小失大嘛。

首先執行repo sync --trace,這樣下次出錯的時候你就能知道出錯的那幾個檔案屬於哪個模組,然後到.repo/manifest/default.xml中將對應的模組刪掉就好了,這樣乙個約等於完整的原始碼就能下到本地了,只是用作研究,看一看是沒有問題的。可以看到我去掉了三個模組,這三個模組暫時和我研究的方向還沒有關係,就先這樣吧 _(:з」∠)_

repo和Git的關係

git作為乙個版本控制工具,功能很強大,新建分支,切換分支都很快,小團隊用git就能很好地管理好了,但如果是android系統如此龐大的工程呢,我們知道全套android原始碼是很大很大的,目錄結構也很複雜,如果直接將其init成乙個git庫,簡直是災難,也不符合解耦的要求。要知道git是無法將整個...

repo和Git 使用記錄

本地 步驟 1 建立資料夾 helloworld,進入目錄 2 新專案初始化 git init 3 將當前目錄下所有檔案新增到緩衝區 git add 4 將緩衝區 提交到本地倉庫 git commit m 注釋 遠端 步驟 1 在github上建立乙個倉庫 git clone git remote ...

repo和git相關命令

1 git clone ssh 使用者名稱 ip 293 ramus intion server b dev 2 git add 修改完成後新增 3 git commit m 提交 4 git push ssh 使用者名稱 ip 293 ramus intion server head refs f...