关于使用repo
获取Android源代码的最小方面或者repo
所做的非常广泛的定义,我遇到了很多简短的问题,因此我们并不真正理解发生了什么。我使用repo
。我按照Android Source site上的说明操作。我在我的repodir
中这样做,所以所有提到的文件都与此有关。
repo init -u https://android.googlesource.com/platform/manifest
repo sync
完成此操作后,我的文件夹中充满了android类型文件夹(bionic
,bootable
等)和隐藏的.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
之后,它仍然包含相同的gingerbread
和ics-mr1
以及一些新的随机文件夹(例如abi
),但似乎没有任何新版本。
从结果来看,我看到我真的不明白我的行为到底在做什么以及如何实现我想要的目标。
如何获取源的整个master
分支的本地版本,然后在我认为合适的情况下在分支之间正确更改?我现在的方式似乎是错误的,因为分支更改后留下的文件似乎不合逻辑。
为了进一步说明,有没有一种有效的方法同时拥有众多分支的本地副本,以便我可以比较每个分支的组件(显然每次都不重新下载它们)?
我问这些问题在理解方面存在很大漏洞(我无法找到明确的一致信息),所以任何关于帮助理解实际工作的答案的额外信息都会真正有价值
答案 0 :(得分:28)
既然你看起来很精明,你知道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
会做很多事情:
我认为克隆操作会在.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存储库的方法,这些存储库可以简单地注册到/包含在总体清单中。我没有回答你的问题项目,但希望我提供了一些背景知识。