應(yīng)用 Android 代碼時(shí),你需要同時(shí)使用 Git 和 Repo,在大多數(shù)情況下,你可以使用 Git 而不是 Repo,或是混合使用 Git 和 Repo 形成的復(fù)雜命令。然而,把 Repo 使用于基本跨網(wǎng)絡(luò)(across-network)的操作時(shí),將會(huì)使你的工作更加簡(jiǎn)單。
Git 是一個(gè)開(kāi)源的版本控制系統(tǒng),設(shè)計(jì)來(lái)處理分布在多個(gè)存儲(chǔ)庫(kù)的大項(xiàng)目。在 Android 背景中,我們可以使用 Git 進(jìn)行本地操作,如本地分支,提交,差異,和編輯。其中我們?cè)诮?Android 項(xiàng)目所面臨的其中一個(gè)挑戰(zhàn)就是如何最好地支持外界社區(qū)——從愛(ài)好社區(qū)到大型 OMEs 構(gòu)建大眾消費(fèi)設(shè)備。我們希望組件能夠被替換,我們還想要有趣的組件去發(fā)展他們?cè)?Android 以外的生活。我們首先選擇一個(gè)分布式的版本控制系統(tǒng),然后進(jìn)一步將其縮小到 Git。
Repo 是我們建立在 Git 頂部的一個(gè)存儲(chǔ)庫(kù)管理工具。Repo 在必要時(shí)可以統(tǒng)一許多個(gè) Git 倉(cāng)庫(kù),上傳到我們的 版本控制系統(tǒng),并且自動(dòng)化 Android 部分開(kāi)發(fā)工作流程。Repo 并不意味著取代 Git,只是幫助更容易地在 Android 環(huán)境中使用 Git。Repo 命令是一個(gè)可執(zhí)行的 Python 腳本,你可以把它放在你的任何路徑上。在使用 Android 源文件工作時(shí),你將把 Repo 使用于跨網(wǎng)絡(luò)操作。例如,使用一個(gè)單一的 Repo 命令,你就可以從多個(gè)存儲(chǔ)庫(kù)下載文件到你的本地目錄下。
Gerrit 是一個(gè)基于 Web 的代碼審查系統(tǒng),使用的是 Git。Gerrit 鼓勵(lì)所有授權(quán)用戶更多的集中使用 Git 來(lái)提交變化,如果他們發(fā)布代碼審查,Gerrit 將可以進(jìn)行自動(dòng)合并。此外,Gerrit 通過(guò)瀏覽器顯示每一步變化使審查變得更加容易,并且支持內(nèi)聯(lián)注釋。
與存儲(chǔ)庫(kù)交互的基本模式如下:
repo start 開(kāi)始一個(gè)新的主題分支。git add 暫存更改。git commit 提交更改。repo upload 上傳更改到審查服務(wù)器。 http://wiki.jikexueyuan.com/project/android-source/images/developing1.png" alt="images" />
下面的任務(wù)列表總結(jié)了如何進(jìn)行普通的 Repo 和 Git 任務(wù)操作。關(guān)于使用 Repo 下載資源的信息,請(qǐng)參閱 下載資源 和 使用 Repo。
同步所有可用項(xiàng)目的文件:
$ repo sync
同步已選擇項(xiàng)目的文件:
$ repo sync PROJECT0 PROJECT1 PROJECT2 ...
當(dāng)你開(kāi)始進(jìn)行一個(gè)改變時(shí),在你的本地工作環(huán)境上新建一個(gè)主題分支,例如當(dāng)你開(kāi)始解決 bug 或開(kāi)發(fā)新功能的時(shí)候。主題分支不是原始文件的復(fù)制;它是一個(gè)特定的提交的指向。這使得創(chuàng)建的本地分支能在它們之間進(jìn)行輕微操作的切換。通過(guò)使用分支,你可以把當(dāng)前的工作與其他工作分離。有關(guān)使用主題分支的一篇有趣的文章,請(qǐng)參閱 分離特性分支。
使用 Repo 開(kāi)始一個(gè)主題分支,導(dǎo)航到該項(xiàng)目進(jìn)行修改和發(fā)布:
$ repo start BRANCH_NAME .
請(qǐng)注意,這個(gè)期間是在當(dāng)前工作目錄下。驗(yàn)證是否已創(chuàng)建新的分支:
$ repo status .
要指定分支到一個(gè)特定的項(xiàng)目:
$ repo start BRANCH_NAME PROJECT_NAME
查看 android.googlesource.com 所有項(xiàng)目的列表。此外,如果你已經(jīng)導(dǎo)航到特定項(xiàng)目的目錄,那么你可以簡(jiǎn)單地傳遞一個(gè)時(shí)期代表當(dāng)前項(xiàng)目。
要切換到您在本地工作環(huán)境中創(chuàng)造的另一個(gè)分支:
$ git checkout BRANCH_NAME
查看現(xiàn)有分支的列表:
$ git branch
或
$ repo branches
當(dāng)前分支的名字將被標(biāo)星號(hào)表示優(yōu)先。
注意:一個(gè) bug 可能會(huì)導(dǎo)致
repo sync重置本地的分支。如果你運(yùn)行repo sync之后,git branch顯示 *(沒(méi)有分支),那就再次運(yùn)行git checkout。
默認(rèn)情況下,Git 通知但沒(méi)有跟蹤你在一個(gè)項(xiàng)目中所做的更改。為了讓 Git 保存你的更改,你必須將它們標(biāo)記在一個(gè) commit 中。這也稱之為 “staging(暫存)”。
你可以在運(yùn)行下面命令來(lái)暫存更改
git add
它接受作為參數(shù)的項(xiàng)目目錄中的任何文件或目錄。盡管 git add 并不如名字表示的這樣簡(jiǎn)單地將文件添加到 Git 倉(cāng)庫(kù),但是它也是可以用來(lái)暫存文件的修改和刪除的。
列出文件的狀態(tài):
$ repo status
查看未提交的編輯:
$ repo diff
repo diff 命令能夠顯示你所做的每一個(gè)本地編輯,除了已經(jīng)進(jìn)入提交的,如果你正準(zhǔn)備現(xiàn)在提交。如果你現(xiàn)在提交,那么你將進(jìn)入提交并且可以看到每一個(gè)編輯狀態(tài),你需要一個(gè) Git 命令,即 git diff 。運(yùn)行它之前,首先確定你是在當(dāng)前項(xiàng)目的目錄下:
$ cd ~/WORKING_DIRECTORY/PROJECT
$ git diff ——cached
在 Git 中,一個(gè) commit 是版本控制的一個(gè)基本單位,是組成目錄結(jié)構(gòu)的一個(gè)快照(snapshot),也是組成整個(gè)項(xiàng)目的文件內(nèi)容。在 Git 中創(chuàng)建一個(gè) commit 很簡(jiǎn)單,只需要輸入如下代碼:
git commit
你將在你最喜歡的編輯器中收到一條 commit 消息的提示;請(qǐng)為你提交到 AOSP 的更改都提供一條有效信息。如果你不添加記錄信息,你的 commit 將會(huì)被中止。
上傳之前,更新到最新版本:
repo sync
然后運(yùn)行
repo upload
這將會(huì)把你已經(jīng)提交的更改列表出來(lái),并且提示你選擇分支上傳到審查服務(wù)器。如果只有一個(gè)分支,那么你會(huì)看到一個(gè)簡(jiǎn)單的 y/n 提示。
如果一個(gè) repo sync 顯示同步?jīng)_突:
在相關(guān)的項(xiàng)目目錄中更改,為上述文件運(yùn)行 git add 和 git commit,然后 “rebase” 這個(gè)更改。例如:
$ git add .
$ git commit
$ git rebase --continue
當(dāng) rebase 完成時(shí)再一次開(kāi)始完整的同步:
$ repo sync PROJECT0 PROJECT1 ... PROJECTN
更改被合并到 Gerrit 之后更新你的本地工作目錄:
$ repo sync
安全的移除已過(guò)時(shí)的主題分支:
$ repo prune
因?yàn)樗袝捍嫖募即鎯?chǔ)在你的客戶端,你只需要從你的文件系統(tǒng)直接刪除目錄:
$ rm -rf WORKING_DIRECTORY
刪除客戶端將會(huì)永久地刪除你還沒(méi)有上傳審查的更改。
http://wiki.jikexueyuan.com/project/android-source/images/developing2.png" alt="images" />