gpt4 book ai didi

java - Android 源代码和 repo - 获取代码时到底发生了什么

转载 作者:IT老高 更新时间:2023-10-28 20:22:59 25 4
gpt4 key购买 nike

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

初始化和同步存储库:

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

完成后,我的文件夹中充满了 android 类型的文件夹( bionicbootable 等)和一个 stash 的 .repo文件夹。值得注意的是,有一个名为 ics-mr1 的文件夹。它与特定版本有关,并且它在我的 repodir 中包含大部分相同的文件夹在它自己里面。

pull 下一个特定的分支:
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的本地版本源的分支,然后在我认为合适的分支之间正确更改?我现在的方式似乎是错误的,因为分支更改后留下的文件似乎不合逻辑。

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

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

最佳答案

repo 初始化

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

第一次使用repo,获取master分支,需要使用

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

然后你需要从服务器同步所有文件:
repo sync

这会将您当前的工作目录更新为您下载的 list 的主版本指定的确切状态。要 checkout 不同版本的 AOSP,请使用:
repo init -b version_name

这会将 list 更新为包含有关您想要的 Android 版本(也称为分支)的信息的 list 。

不要忘记同步。

To switch to another manifest branch, repo init -b otherbranch may be used in an existing client. However, as this only updates the manifest, a subsequent repo sync (or repo sync -d) is necessary to update the working directory files.



您遇到的行为可能看起来很奇怪,因为您可能不习惯使用一个如此容易覆盖本地状态的系统。使用 git 时,您不应该 init在同一目录中多次。另一种选择是为每个项目创建新目录。 .repo 目录的目的是存储与当前 repo 设置相关的所有信息(也类似于 .git 目录)。事实上,正在运行 repo init做很多事情:
  • 从指定的 url 下载 list 。
  • 尝试打开或创建 .repo 目录。
  • 确保您的 GPG key 已设置。
  • 克隆 指定的分支(如果没有指定,默认为 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 中创建本地镜像。目录。然后,从新目录中的镜像中 check out 所需的分支,例如 workspace/gingerbread .现在,您只需更改到适当的目录即可在分支之间切换。

    在本地镜像 AOSP:
    cd workspace
    mkdir master && cd master
    repo init --mirror

    将导致 repo 镜像本地机器上的远程服务器。然后,当你想切换到一个新的分支时,你可以:
    mkdir ../gingerbread && cd ../gingerbread
    repo init -b version_name --reference=../master

    结果是一个工作区,其中包含一个包含镜像的文件夹和一个包含引用镜像的 Gingerbread 分支的文件夹。

    另一种选择是简单地初始化和同步你想要的分支,然后将文件夹复制到另一个位置并使用副本再次初始化和同步。 Repo 应该只下载缺少的东西。

    其他 repo 用途:

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

    关于java - Android 源代码和 repo - 获取代码时到底发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870217/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com