repo init
由于你显得相当精明,你知道 repo 只是一个 Python 脚本吧?你可以阅读它以了解其工作原理。虽然我没有完整地阅读过它,但基本上它包装了 git
并提供了在多个 git 存储库之间工作的支持。其主要思想是有一个清单文件,指定了不同版本的 Android 的需求。当你使用 repo init
带参数时,它会查看需要克隆哪些 git 存储库,你已经同步了哪些 git 存储库以及一旦获取了合适的存储库,需要获取哪些分支。然后它处理将所有受其管理的存储库保持在适当的分支上。把 repo 视为标准 git 工作流程的另一层(我假设你熟悉)。
第一次使用 repo 时,要获取主分支,你需要使用
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
仓库只需删除大约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
执行此命令将使存储库在本地机器上镜像远程服务器。然后,当您想要切换到一个新分支时,您可以:
mkdir ../gingerbread && cd ../gingerbread
repo init -b version_name --reference=../master
结果是一个工作空间,其中包含一个包含镜像的文件夹和一个包含参考镜像尽可能的姜饼分支的文件夹。
另一个选项是简单地初始化和同步您想要的分支,然后将文件夹复制到另一个位置,并使用该副本再次初始化和同步。Repo 应该只下载丢失的部分。
其他 Repo 用途:除了 init 外,repo 还提供了对传递命令(如 branch)到给定清单中所有不同 git 存储库的支持,这样在处理代码时就无需担心。它还通过使将本地更改提交到 Gerrit 代码审查系统变得容易来促进协作。我不确定将 AOSP 分区为多个 git 存储库的官方原因是什么,但我想这是为了管理版本控制的扩展性问题以及保持项目的稳健和容错性(如果有人破坏一个 git 存储库,它不会摧毁整个 AOSP)。此外,有必要提供一种供供应商回馈源代码并让他们管理自己的 git 存储库的方式,这些存储库可以简单地与/注册到一个总体清单中,这很合理。我没有按行回答你的问题,但希望我提供了一些背景。
repo
工作了一年多,因为找不到任何有用的信息而放弃。这个答案单独就提供给我比我在那段时间里找到的所有信息都更加清晰和有价值的信息和理解。我会尝试解决关闭问题的混乱。 - btalbrepo-script
相对于git-submodules
有哪些优势?这是在进行比较吗? - CAMOBAP