回购初始化
既然你看起来很精明,你知道 repo 只是一个 python 脚本,对吧?您可以阅读它以了解它是如何工作的。我还没有通读整篇文章,但基本上,它包装git
并提供了跨多个 git 存储库工作的支持。这个想法是有一个清单文件指定不同版本的 Android 的要求。当您repo init
使用参数时,它会查看需要克隆哪些 git 存储库以及您已经同步了哪些 git 存储库,以及在获得正确的存储库后需要获取哪些分支。然后它处理将其管理的所有存储库保存在适当的分支上。将 repo 视为在标准 git 工作流程中添加了另一层(我假设您对此很熟悉)。
第一次使用repo,要获取master分支,需要使用
repo init -u https://android.googlesource.com/platform/manifest
之后,您需要从服务器同步所有文件:
repo sync
这会将您当前的工作目录更新为您下载的清单的主版本指定的确切状态。要签出不同版本的 AOSP,请使用:
repo init -b version_name
这会将清单更新为包含您想要的 Android 版本信息的清单(也称为分支)。
不要忘记同步。
要切换到另一个清单分支,repo init -b otherbranch
可以在现有客户端中使用。但是,由于这仅更新清单,因此需要后续repo sync
(或repo sync -d
)来更新工作目录文件。
您遇到的行为可能看起来很奇怪,因为您可能不习惯使用如此容易覆盖本地状态的系统。使用 git 时,您不应该在同一个目录init
中多次。另一种选择是为每个项目创建新目录。.repo 目录的目的是存储与当前 repo 设置相关的所有信息(也像 .git 目录)。事实上,跑步做了很多事情:repo init
- 从指定的 url 下载清单。
- 尝试打开或创建 .repo 目录。
- 确保您的 GPG 密钥已设置。
- 克隆指定的分支(如果没有指定,则默认为 REPO_REV)。
- 验证它。
- 检查每个项目的适当分支。
我假设克隆操作会覆盖.repo
文件夹中的信息。运行第一个命令后需要很长时间的原因:
repo init -u https://android.googlesource.com/platform/manifest
repo sync
是因为它必须下载许多千兆字节的信息。现在,从master
分支转到gingerbread
repo 知道它只需要删除大约 68 次提交,这可以非常快速地完成。
$ repo init -u https://android.googlesource.com/platform/manifest -b gingerbread
$ repo sync
...
.repo/manifests/: discarding 68 commits
...
回升android_4.2.2_r1
意味着 repo 必须再次下载这些提交所需的任何信息,并更新所有引用项目的当前分支。这将需要很长时间;repo 是用磁盘使用来换取处理时间。
真的吗?
现在,这提出了一个问题:如果你想一次比较两个 repo 分支怎么办?这很困难,因为当repo init && repo sync
您丢失您正在查看的旧信息时。答案是复制相关信息,然后repo init && repo sync
再复制。这会很快变得烦人——谢天谢地,如果你有磁盘空间,repo 提供了一种加速这个过程的方法。
使事情变得更快的一种策略是在workspace/master
目录中创建本地镜像。然后,从新目录中的镜像中签出所需的分支,例如workspace/gingerbread
. 现在您只需切换到适当的目录即可在分支之间切换。
在本地镜像 AOSP:
cd workspace
mkdir master && cd master
repo init --mirror
将导致 repo 镜像本地计算机上的远程服务器。然后,当你想切换到一个新的分支时,你可以:
mkdir ../gingerbread && cd ../gingerbread
repo init -b version_name --reference=../master
结果是一个工作区,其中包含一个包含镜像的文件夹和一个包含姜饼分支的文件夹,该分支在可能的情况下引用镜像。
另一种选择是简单地初始化和同步您想要的分支,然后将文件夹复制到另一个位置并使用副本再次初始化和同步。回购应该只下载缺少的东西。
其他回购用途:
Beyond init
, repo 提供了对传递命令的支持,例如branch
, 到给定清单中的所有不同 git 存储库,这样您在使用代码时就不必担心这一点。它还通过使您可以轻松地将本地更改提交到 gerrit 代码审查系统来促进协作。我不确定将 AOSP 划分为多个 git 存储库的官方原因是什么,但我想这样做是为了管理版本控制的扩展问题并保持项目的健壮性和容错性(如果有人刹车一个 git repo 它不会破坏整个 AOSP)。还需要提供一种方式,让供应商可以回馈源代码,并让他们管理自己的 git 存储库,这些存储库可以简单地注册到总体清单中是有意义的。我没有回答你的问题行项目,