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

时间:2013-04-08 02:11:40

标签: java android git android-source repository

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

初始化和同步回购:

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的文件夹(所有原始文件夹似乎都保留)。

我现在试试这个,需要时间:

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

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

问题

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

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

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

我问这些问题在理解方面存在很大漏洞(我无法找到明确的一致信息),所以任何关于帮助理解实际工作的答案的额外信息都会真正有价值

1 个答案:

答案 0 :(得分:28)

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会做很多事情:

  1. 从指定的网址下载清单。
  2. 尝试打开或创建.repo目录。
  3. 确保您的GPG密钥已设置。
  4. 克隆指定的分支(如果未指定,则默认为REPO_REV)。
  5. 验证它。
  6. 检查每个项目的相应分支。
  7. 我认为克隆操作会在.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 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
    

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

    另一个选项是简单地初始化和同步所需的分支,然后将该文件夹复制到另一个位置并使用该副本进行初始化和再次同步。回购应该只下载缺少的东西。

    其他回购用途:

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