Android使用repo来管理多个Git项目。它需要一个manifest XML文件来指示这些git项目的属性。
repo manifest XML可以包含下面的元素。
以如下,manifest片段为例:https://github.com/CyanogenMod/android
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="github"
fetch=".."
review="review.cyanogenmod.org" />
<remote name="private"
fetch="ssh://git@github.com" />
<remote name="aosp"
fetch="https://android.googlesource.com"
review="android-review.googlesource.com"
revision="refs/tags/android-7.1.1_r6" />
<default revision="refs/heads/cm-14.1"
remote="github"
sync-c="true"
sync-j="4" />
<!-- AOSP Projects -->
<project path="build" name="CyanogenMod/android_build" groups="pdk,tradefed">
<copyfile src="core/root.mk" dest="Makefile" />
</project>
<project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" remote="aosp" />
<project path="build/kati" name="CyanogenMod/android_build_kati" groups="pdk,tradefed" />
<project path="build/soong" name="platform/build/soong" groups="pdk,tradefed" remote="aosp" >
<linkfile src="root.bp" dest="Android.bp" />
<linkfile src="bootstrap.bash" dest="bootstrap.bash" />
</project>
<project path="abi/cpp" name="platform/abi/cpp" groups="pdk" remote="aosp" />
<project path="art" name="CyanogenMod/android_art" groups="pdk" />
</manifest>
最顶层的XML元素。
设置远程git服务器的属性,包括下面的属性:
一个manifest文件中可以配置多个remote元素,用于配置不同的project默认下载指向。
设定所有projects的默认属性值,如果在project元素里没有指定一个属性,则使用default元素的属性值。
Example:
<default remote="main" revision="platform/main"/>
指定一个需要clone的git仓库。
Project元素下面会有两个子元素。Copyfile和linkfile
<copyfile src="core/root.mk" dest="Makefile" />
<linkfile src="root.bp" dest="Android.bp" />
Copefile:复制,cp src dest
Linkfile:软链接 ,ln -s src dest
Example:
<project groups="aosp" path="device/driver/armv7" revision="600aab270ce712b62b268055737cabcded59bf04"/>
通过name属性可以引入另外一个manifest文件(路径相对与manifest repository's root)。
Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 Repo 命令行工具,对 Git 部分命令封装,将百多个 Git 库有效的进行组织。
所谓的清单库,就是我们为manifest文件单独建的一个库,一个清单库可以包含多个清单文件和多个分支,每个清单文件和分支都有对应的版本。我们就是根据不同的manifest文件来下载不同的代码。
在ubuntu中可以通过命令进行repo的安装:
Sudo apt-get install repo
也可以直接下载repo文件,然后将路径配置到环境变量里面。
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
安装 Repo 后,您可以通过运行以下命令找到最新文档(开头是包含所有命令的摘要):
repo help
您可以通过在 Repo 树中运行以下命令来获取有关某个命令的信息:
repo help <COMMAND>
例如,以下命令会生成 Repo init 参数的说明和选项列表,该参数会在当前目录中初始化 Repo。(要了解详情,请参阅 init。)
repo help init
Usage
repo init –u URL [OPTIONS]
在当前目录中安装 Repo。这会创建一个 .repo/ 目录,其中包含用于 Repo 源代码和标准 Android 清单文件的 Git 代码库。该 .repo/ 目录中还包含 manifest.xml,这是一个指向 .repo/manifests/ 目录中所选清单的符号链接。
Options:
命令repo init 要完成如下操作:
Usage
repo sync [<PROJECT_LIST>]
下载新的更改并更新本地环境中的工作文件。如果您在未使用任何参数的情况下运行 repo sync,则该操作会同步所有项目的文件。
运行 repo sync 后,将出现以下情况:
如果目标项目已同步过,则 repo sync 相当于以下命令:
git remote update
git rebase origin/<BRANCH>
其中 <BRANCH> 是本地项目目录中当前已检出的分支。如果本地分支没有在跟踪远程代码库中的分支,则相应项目不会发生任何同步。
Option:
Usage
repo start <BRANCH_NAME> [<PROJECT_LIST>]
从清单中指定的修订版本开始,创建一个新的分支进行开发。
Usage
repo diff [<PROJECT_LIST>]
使用 git diff 显示提交与工作树之间的明显更改。
Usage
repo prune [<PROJECT_LIST>]
删减(删除)已合并的主题。
Usage
repo status [<PROJECT_LIST>]
对于每个指定的项目,将工作树与临时区域(索引)以及此分支 (HEAD) 上的最近一次提交进行比较。在这三种状态存在差异之处显示每个文件的摘要行。
要仅查看当前分支的状态,请运行 repo status。系统会按项目列出状态信息。对于项目中的每个文件,系统使用两个字母的代码来表示:
在第一列中,大写字母表示临时区域与上次提交状态之间的不同之处。
{|
| 字母 || 含义 || 说明
|-
| - || 无更改 || HEAD 与索引中相同
|-
| A || 已添加 || 不存在于 HEAD 中,但存在于索引中
|-
| M || 已修改 || 存在于 HEAD 中,但索引中的文件已修改
|-
| D || 已删除 || 存在于 HEAD 中,但不存在于索引中
|-
| R || 已重命名 || 不存在于 HEAD 中,但索引中的文件的路径已更改
|-
| C || 已复制 || 不存在于 HEAD 中,已从索引中的另一个文件复制
|-
| T || 模式已更改|| HEAD 与索引中的内容相同,但模式已更改
|-
| U || 未合并 || HEAD 与索引之间存在冲突;需要解决方案
|}
在第二列中,小写字母表示工作目录与索引之间的不同之处。
{|
| 字母 | 含义 | 说明
|-
| - | 新/未知 | 不存在于索引中,但存在于工作树中
|-
| m | 已修改 | 存在于索引中,也存在于工作树中(但已修改)
|-
| d | 已删除 | 存在于索引中,不存在于工作树中
|}
Usage
repo forall [<PROJECT_LIST>] -c <COMMAND>
在每个项目中运行指定的 shell 命令。通过 repo forall 可使用下列额外的环境变量:
Option: