Android 使用 Git 做爲代碼管理工具,開發了Gerrit進行代碼審覈以便更好的對代碼進行集中式管理,還開發了Repo命令行工具,對Git部分命令封裝,將百多個Git庫有效的進行組織。android
mkdir ~/bin PATH=~/bin:$PATH curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo
一個清單庫能夠包含多個清單文件和多個分支,每一個清單文件和分支都有對應的版本。清單文件以xml格式組織的。舉個例子:git
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0_r27
<?xml version="1.0" encoding="UTF-8"?> <manifest> <remote name="aosp" fetch=".." review="https://android-review.googlesource.com/" /> <default revision="refs/tags/android-11.0.0_r27" remote="aosp" sync-j="4" /> <project path="build/make" name="platform/build" groups="pdk" > <copyfile src="core/root.mk" dest="Makefile" /> <linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" /> <linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" /> <linkfile src="core" dest="build/core" /> <linkfile src="envsetup.sh" dest="build/envsetup.sh" /> <linkfile src="target" dest="build/target" /> <linkfile src="tools" dest="build/tools" /> </project> <project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" /> ... </manifest>
refs/tags/android-11.0.0_r27
。固然各個project元素還能夠定義本身的remote和revision覆蓋默認的配置。repo init –u URL [OPTIONS]
命令repo init 要完成以下操做:shell
.repo/manifests
。在以前的repo版本中清單.repo/manifest.xml
只是符號連接,它指向.repo/manifests/default.xml
。在目前的repo版本中清單.repo/manifest.xml
是一個實際的文件,經過include的方式引用.repo/manifests/default.xml
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0_r27 # 在當前目錄出現了.repo文件夾 repo init -u git://172.16.1.31/manifest.git –m android.xml # 選擇的是android.xml裏面的配置,.repo/manifest.xml便指向.repo/manifests/android.xml
repo sync [<project>…]
用於參照清單文件.repo/manifest.xml克隆並同步版本庫。若是某個項目版本庫尚不存在,則執行repo sync 命令至關於執行git clone,若是項目版本庫已經存在,則至關於執行下面的兩條指令:api
git remote update # 至關於對每個remote源執行了fetch操做 git rebase origin/branch # 針對當前分支的跟蹤分支執行rebase操做
repo sync repo sync platform/build # 也能夠選擇克隆其中的一個項目
repo start <newbranchname> [--all | <project>…]
剛克隆下來的代碼是沒有分支的,repo start實際是對git checkout –b 命令的封裝。爲指定的項目或全部項目(若使用—all參數),以清單文件中爲設定的分支,建立特性分支。這條指令與git checkout –b 仍是有很大的區別的,git checkout –b 是在當前所在的分支的基礎上建立特性分支,而repo start是在清單文件設定分支的基礎上建立特性分支。服務器
repo start stable --all # 假設清單文件中設定的分支是gingerbread-exdroid-stable,那麼執行以上指令就是對全部項目,在gingerbread-exdroid-stable的基礎上建立特性分支stable repo start stable platform/build platform/bionic # 假設清單文件中設定的分支是gingerbread-exdroid-stable,那麼執行以上指令就是對platform/build、platform/bionic項目,在gingerbread-exdroid-stable的基礎上建立特性分支stable
repo checkout <branchname> [<project>…]
其實是對git checkout 命令的封裝,但不能帶-b參數,因此不能用此命令來建立特性分支。ssh
repo checkout crane-dev repo checkout crane-dev platform/build platform/bionic
repo branches [<project>…]
repo branches repo branches platform/build platform/bionic
repo diff [<project>…]
實際是對git diff 命令的封裝,用於分別顯示各個項目工做區下的文件差別。curl
repo diff # 查看全部項目 repo diff platform/build platform/bionic # 只查看其中兩個項目
實際是對git add --interactive命令的封裝、用於挑選各個項目工做區中的改動以加入暫存區。ionic
repo stage -i [<project>…]
-i表明git add --interactive命令中的--interactive,給出個界面供用戶選擇工具
其實是對git branch –d命令的封裝,該命令用於掃面項目的各個分支,並刪除已經合併的分支,用法以下:fetch
repo prune [<project>…]
其實是對git branch –D 命令的封裝,用法以下:
repo abandon <branchname> [<project>…]
其實是對git diff-index、git diff-filse命令的封裝,同時顯示暫存區的狀態和本地文件修改的狀態
repo status platform/bionic
以上的實例輸出顯示了platform/bionic項目分支的修改狀態
repo remote add <remotename> <url> [<project>…] repo remote rm <remotename> [<project>…]
repo remote add org ssh://172.16.1.31/git_repo # 這個指令是根據xml文件添加的遠程分支,方便於向服務器提交代碼,執行以後的build目錄下看到新的遠程分支org repo remote rm org # 刪除遠程倉庫
repo push <remotename> [--all |<project>…]
這是新添加的指令,用於向服務器提交代碼,repo會本身查詢須要向服務器提交的項目並提示用戶。
repo push org
repo forall [<project>…] –c <command>
迭代器,能夠在全部指定的項目中執行同一個shell指令
additional environment variables:
另外,若是-c後面所帶的shell指令中有上述環境變量,則須要用單引號把shell指令括起來。
repo forall –c ‘echo $REPO_PROJECT’ repo forall –c ‘echo $REPO_PATH’
把全部項目多切換到master分支,執行如下指令將topic分支合併到master分支
repo forall –p –c git merge topic
在全部項目下打標籤
repo forall –c git tag crane-stable-1.6
引用環境變量REPO_PROJECT添加遠程倉庫:
repo forall –c ‘git remote add korg ssh://xiong@172.16.31/$REPO_PROJECT.git’
刪除遠程倉庫:
repo forall –c git remote add korg
repo forall –c git branch crane-dev repo forall –c git checkout –b crane-dev
至關於對git grep 的封裝,用於在項目文件中進行內容查找
顯示manifest文件內容
repo manifest –o android.xml
顯示repo的版本號
repo upload至關於git push,可是又有很大的不一樣。它不是將版本庫改動推送到克隆時的遠程服務器,而是推送到代碼審覈服務器(Gerrit軟件架設)的特殊引用上,使用SSH協議。代碼審覈服務器會對推送的提交進行特殊處理,將新的提交顯示爲一個待審覈的修改集,並進入代碼審查流程,只有當審覈經過後,纔會合併到官方正式的版本庫中。
repo upload [--re --cc] {[<project>]… | --replace <project>}
主要用於代碼審覈者下載和評估貢獻者提交的修訂
repo download {project change [patchset]}…
用於repo自身的更新