开发

要处理 Android 代码,您需要同时使用 Git 和 Repo。在大多数情况下,您可以仅使用 Git(不必使用 Repo),或结合使用 Repo 和 Git 命令以组成复杂的命令。不过,使用 Repo 执行基本的跨网络操作可大大简化您的工作。

Git 是一个开放源代码的版本控制系统,专用于处理分布在多个代码库上的大型项目。在 Android 环境中,我们会使用 Git 执行本地操作,例如建立本地分支、提交、查看更改、修改。打造 Android 项目所面临的挑战之一就是确定如何最好地支持外部社区 - 从业余爱好者社区到生产大众消费类设备的大型原始设备制造商 (OEM)。我们希望组件可以替换,并希望有趣的组件能够在 Android 之外自行发展。我们最初决定使用一种分布式修订版本控制系统,经过筛选,最后选中了 Git。

Repo 是我们以 Git 为基础构建的代码库管理工具。Repo 可以在必要时整合多个 Git 代码库,将相关内容上传到我们的修订版本控制系统,并自动执行 Android 开发工作流程的部分环节。Repo 并非用来取代 Git,只是为了让您在 Android 环境中更轻松地使用 Git。Repo 命令是一段可执行的 Python 脚本,您可以将其放在路径中的任何位置。使用 Android 源代码文件时,您可以使用 Repo 执行跨网络操作。例如,您可以借助单个 Repo 命令,将文件从多个代码库下载到本地工作目录。

Gerrit 是一个基于网页的代码审核系统,适用于使用 Git 的项目。Gerrit 允许所有授权用户提交更改(如果通过代码审核,这些更改会自动纳入项目中),以此鼓励他们更集中地使用 Git。此外,Gerrit 可以在浏览器中并排显示更改,并支持代码内注释,使得审核工作变得更轻松。

Android Studio 是用于开发 Android 应用的官方集成开发环境 (IDE)。如需了解详情,请参阅 Android Studio 概览

基本工作流程

基本工作流程示意图

图 1. Android 基本工作流程

与代码库进行交互的基本模式如下:

  1. 使用 repo start 新建一个主题分支。

  2. 修改文件。

  3. 使用 git add 暂存更改。

  4. 使用 git commit 提交更改。

  5. 使用 repo upload 将更改上传到审核服务器。

任务参考

以下任务列表简要总结了如何执行常见的 Repo 和 Git 任务。要了解如何使用 Repo 下载源代码,请参阅下载源代码使用 Repo

同步客户端

要同步所有可用项目的文件,请运行以下命令:

$ repo sync

要同步所选项目的文件,请运行以下命令:

$ repo sync PROJECT0 PROJECT1 PROJECT2 ...

创建主题分支

当您开始进行更改(例如当您开始处理错误或使用新功能)时,请在本地工作环境中新建一个主题分支。主题分支不是原始文件的副本;它代表着特定提交。这样一来,您可以轻松创建本地分支并在这些分支之间切换。通过使用分支,您可以将工作的某个方面与其他方面分隔开来。请参阅分隔主题分支(一篇有关使用主题分支的趣味文章)。

要使用 Repo 新建一个主题分支,请转到要修改的项目并运行以下命令:

$ repo start BRANCH_NAME .

请注意,句点代表当前工作目录中的项目。要验证您的新分支是否已创建,请运行以下命令:

$ repo status .

使用主题分支

要将分支分配给特定项目,请运行以下命令:

$ repo start BRANCH_NAME PROJECT_NAME

要查看所有项目的列表,请访问 android.googlesource.com。再次提醒,如果您已转到特定的项目目录,可以简单地使用一个句点来表示当前项目。

要切换到您已在本地工作环境中创建的另一个分支,请运行以下命令:

$ git checkout BRANCH_NAME

要查看现有分支的列表,请运行以下命令:

$ git branch

$ repo branches

当前分支的名称前面将标注星号。

注意:错误可能会导致 repo sync 重置本地主题分支。如果在您运行 repo sync 之后,git branch 显示 *(无分支),请再次运行 git checkout

暂存文件

默认情况下,Git 会检测到您在项目中所做的更改,但不会跟踪这些更改。要让 Git 保存您的更改,您必须将更改标记为包含在提交中。这也称为“暂存”。

您可以通过运行以下命令来暂存更改:

git add

对于此命令,项目目录中的任何文件或目录都可作为参数。git add 并不像其名称表示的这样只是简单地将文件添加到 Git 代码库,它还可以用于暂存文件的修改和删除的内容。

查看客户端状态

要列出文件的状态,请运行以下命令:

$ repo status

要查看未提交的修改,请运行以下命令:

$ repo diff

如果您准备立即提交,运行 repo diff 命令可让系统显示您所做的不会包含在提交中的每一项本地更改。如果您准备立即提交,要查看将包含在提交中的每一项更改,您需要运行 Git 命令 git diff。在运行该命令之前,请确保您已转到项目目录下:

$ cd ~/WORKING_DIRECTORY/PROJECT
$ git diff --cached

提交更改

在 Git 中,提交是修订版本控制的基本单位,包含目录结构的快照以及整个项目的文件内容。在 Git 中创建提交很简单,只需输入以下命令即可:

git commit

系统会提示您使用惯用的编辑器提供一条提交消息;请为您提交到 AOSP 的所有更改都提供一条会有帮助作用的消息。如果您没有添加日志消息,提交将会终止。

将更改上传到 Gerrit

上传之前,请先更新为最新修订版本:

repo sync

然后运行以下命令:

repo upload

运行此命令后,系统会随即列出您已提交的更改,并提示您选择要上传到审核服务器的分支。如果只有一个分支,您会看到一个简单的 y/n 提示符。

恢复同步冲突

如果 repo sync 显示同步冲突,请执行以下操作:

  • 查看未合并的文件(状态代码 = U)。
  • 根据需要修改存在冲突的地方。
  • 在相关项目目录中进行更改,为相关文件运行 git addgit commit,然后对这些更改执行“衍合”(rebase) 命令。例如:

    $ git add .
    $ git commit
    $ git rebase --continue
    
  • 当衍合完成后,再一次开始整个同步过程:

    $ repo sync PROJECT0 PROJECT1 ... PROJECTN
    

清理您的客户端文件

要在更改合并到 Gerrit 中后更新您的本地工作目录,请运行以下命令:

$ repo sync

要安全移除已过时的主题分支,请运行以下命令:

$ repo prune

删除客户端

由于所有状态信息都会存储在客户端中,您只需从文件系统中删除相应目录即可:

$ rm -rf WORKING_DIRECTORY

删除客户端将永久删除您尚未上传以供审核的任何更改。

Git 和 Repo 快速参考表

基本 Git 和 Repo 命令列表

图 2. 基本 Git 和 Repo 命令