27

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

初始化和同步 repo:

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

完成后,我的文件夹中充满了 android 类型的文件夹(bionicbootable等)和一个隐藏.repo文件夹。值得注意的是,有一个名为ics-mr1与特定版本相关的文件夹,它在我的repodir内部包含几乎相同的文件夹。

拉下一个特定的分支:

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

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

我现在试试这个,它需要 AGES:

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

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

问题

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

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

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

我问这些问题时存在很大的理解漏洞(我一直无法找到明确一致的信息),因此任何关于答案的额外信息以帮助理解实际正在做的事情真的很有价值。

4

1 回答 1

31

回购初始化

既然你看起来很精明,你知道 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

  1. 从指定的 url 下载清单。
  2. 尝试打开或创建 .repo 目录。
  3. 确保您的 GPG 密钥已设置。
  4. 克隆指定的分支(如果没有指定,则默认为 REPO_REV)。
  5. 验证它。
  6. 检查每个项目的适当分支。

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

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

是因为它必须下载许多千兆字节的信息。现在,从master分支转到gingerbreadrepo 知道它只需要删除大约 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 存储库,这些存储库可以简单地注册到总体清单中是有意义的。我没有回答你的问题行项目,

于 2013-04-08T04:16:44.133 回答