Android 源代码和存储库 - 获取代码时究竟发生了什么

2022-09-01 16:02:27

我遇到了很多关于使用获取Android源代码的最小方面的简短问题,或者对什么的非常广泛的定义,因此我并不真正了解当我使用时发生了什么。我正在按照Android Source网站上的说明进行操作。我一直在这样做,所以所有提及的文件都是与此相关的。reporeporeporepodir

初始化和同步存储库:

repo init -u https://android.googlesource.com/platform/manifest
repo sync

完成此操作后,我的文件夹充满了Android类型的文件夹(,等)和一个隐藏的文件夹。值得注意的是,有一个名为与特定版本相关的文件夹,它包含我内部的大部分文件夹。bionicbootable.repoics-mr1repodir

下拉特定分支:

repo init -u https://android.googlesource.com/platform/manifest -b gingerbread
repo sync

这完成得相对较快,我看到的主要变化是现在有一个名为(所有原始文件夹似乎都保留下来)的文件夹。gingerbread

我现在尝试这个,它需要年龄:

repo init -u https://android.googlesource.com/platform/manifest -b android_4.2.2_r1
repo sync

之后,它仍然包含相同和一些新的随机文件夹(如),但似乎没有新版本。gingerbreadics-mr1abi

问题

从结果来看,我真的不明白我的行为到底在做什么,以及如何实现我想要实现的目标。

如何获取源的整个分支的本地版本,然后根据需要在分支之间正确更改?我目前的方式似乎是错误的,因为分支更改后留下的文件似乎不合逻辑。master

为了进一步说明这一点,是否有一种有效的方法可以同时拥有多个分支的本地副本,以便我可以比较每个分支的组件(显然不会每次都重新下载它们)?

我问这些问题在理解上有很大的漏洞(我一直无法找到清晰一致的信息),所以任何关于答案的额外信息,以帮助理解实际正在做的事情,这将是真正有价值的。


答案 1

回购初始化

由于你看起来很精明,你知道repo只是一个python脚本,对吧?您可以阅读它以确切地了解它是如何工作的。我还没有通读整个内容,但是,基本上,它包装并提供了跨多个git存储库工作的支持。这个想法是有一个清单文件,用于指定不同版本的Android的要求。当您使用参数时,它会查看需要克隆哪些git存储库,您已经同步了哪些git存储库,以及获得正确的存储库后需要获取哪些分支。然后,它处理将其管理的所有存储库保留在适当的分支上。将存储库视为向标准 git 工作流添加另一层(我假设你对此很熟悉)。gitrepo init

第一次使用存储库时,要获取主分支,需要使用

repo init -u https://android.googlesource.com/platform/manifest

之后,您需要同步服务器中的所有文件:

repo sync

这会将当前工作目录更新到由下载的清单的主版本指定的确切状态。要签出不同版本的 AOSP,请使用:

repo init -b version_name

这会将清单更新为包含有关所需 Android 版本的信息的清单(也称为分支)。

不要忘记同步。

若要切换到另一个清单分支,可以在现有客户端中使用。但是,由于这仅更新清单,因此需要后续(或)来更新工作目录文件。repo init -b otherbranchrepo syncrepo sync -d

您正在经历的行为可能看起来很奇怪,因为您可能不习惯使用如此容易覆盖本地状态的系统。使用 git 时,您不应该在同一目录中多次使用。另一种选择是为每个项目创建新目录。.repo 目录的目的是存储与当前存储库设置相关的所有信息(也类似于 .git 目录)。事实上,跑步可以做很多事情:initrepo init

  1. 从指定的 URL 下载清单。
  2. 尝试打开或创建 .repo 目录。
  3. 确保您的 GPG 密钥已设置。
  4. 克隆指定的分支(如果未指定任何分支,则默认为REPO_REV)。
  5. 验证它。
  6. 签出每个项目的相应分支。

我假设克隆操作会覆盖文件夹中的信息。运行第一个命令后需要很长时间的原因:.repo

repo init -u https://android.googlesource.com/platform/manifest
repo sync

是因为它必须下载许多千兆字节的信息。现在,从分支到存储库知道它只需要删除大约68个提交,这可以非常快速地完成。mastergingerbread

$ 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 init && repo syncrepo init && repo sync

使事情变快的一种策略是在目录中创建本地镜像。然后,从新目录中的镜像中签出所需的分支,例如.现在,您只需更改为适当的目录即可在分支之间切换。workspace/masterworkspace/gingerbread

在本地镜像 AOSP:

cd workspace
mkdir master && cd master
repo init --mirror

将导致存储库镜像本地计算机上的远程服务器。然后,当您想要切换到新分支时,您可以:

mkdir ../gingerbread && cd ../gingerbread
repo init -b version_name --reference=../master

结果是一个工作区,其中包含一个包含镜像的文件夹和一个包含姜饼分支的文件夹,该分支在可能的情况下引用镜像。

另一种选择是简单地初始化和同步所需的分支,然后将文件夹复制到另一个位置,然后使用副本再次初始化和同步。存储库应仅下载缺少的内容。

其他回购用途:

此外,存储库还支持将命令(如 )传递给给定清单中的所有不同 git 存储库,以便您在使用代码时不必担心这一点。它还通过使您可以轻松地将本地更改提交到gerrit代码审查系统来促进协作。我不确定将AOSP划分为多个git存储库的官方原因是什么,但我认为这样做是为了管理版本控制的扩展问题,并保持项目的健壮性和容错性(如果有人制动一个git存储库,它不会破坏整个AOSP)。还有必要提供一种供应商可以回馈源代码的方法,并让他们管理自己的git存储库,这些存储库可以简单地注册到总体清单中是有意义的。我没有回答你的问题行项目,但希望我提供了一些背景。initbranch


答案 2

推荐