Android repo清单仓库是如何工作的?

54

Android源代码是一个由许多 git仓库 组成的庞大层级结构。它们由一个名为repo的自定义脚本进行管理。Repo使用manifest.xml确定要管理哪些git仓库。Android的manifest.xml与所有其他git仓库一起托管在一个git仓库中。

在Android中,这个仓库是如何管理的?具体来说,不同分支和每个分支中的不同文件是如何组织的?

2个回答

68

首先,repo init 创建 .repo 目录,将 Git 仓库 https://android.googlesource.com/tools/repo 克隆到 .repo/repo,并将使用 -u 选项指定的 Git 仓库克隆到裸仓库中的 .repo/manifests.git。之后,它创建 .repo/manifests 目录,并通过在 .repo/manifests/.git.repo/manifests.git 之间创建符号链接将其转换为 Git 仓库。然后它检出 -b 中指定的分支,并创建一个符号链接 .repo/manifest.xml,指向在 .repo/manifests 中指定的文件(使用 -m 选项),默认为 .repo/manifests/default.xml

大致如下:

  repo init -u $URL -b $BRANCH -m $MANIFEST
  --------------------
  mkdir .repo; cd .repo
  git clone https://android.googlesource.com/tools/repo
  git clone --bare $URL manifests.git
  mkdir -p manifests/.git; cd manifests/.git
  for i in ../../manifests.git/*; do ln -s $ı .; done
  cd ..
  git checkout $BRANCH -- .
  cd ..
  ln -s manifests/$MANIFEST manifest.xml  

您可以使用 repo --trace init ... 来跟踪实际发生的情况。

然后,repo syncmanifest.xmllocal_manifest.xml 中的每个项目克隆 Git 仓库到 .repo/projects,创建带有指向对应裸仓库的符号链接的工作目录,检出在清单中指定的分支,并更新 .repo/project.list。如果项目已经存在,则情况略有不同,基本上执行 git pull --rebase


很想听听为什么他们这样做的解释!特别是,将所有.git内容存储在.repo / projects /内部有什么好处? - Hamy
我不知道repo背后的人为什么选择了他们的方法。在某些版本的repo中,可以在不同的构建树之间共享.repo/projects目录,这在硬盘较小的笔记本电脑上非常方便。但是这从未得到支持,我也不确定它是否还能用。 - Pekka Nikander
3
@Hamy - 它允许删除一个可见的项目构建目录,而不会丢失git对象,因此后续的repo同步将更快。 - Sam Liddicott
1
澄清一下:大多数元素 .repo/manifests/.git/<element>(如 objectsrefs 等)都是符号链接到 .repo/manifests.git/<element>,而不是将整个 .git 目录符号链接。 - phi1010

9
在仓库的根目录下,有一个名为“.repo”的隐藏目录。里面有一个名为“manifests”的git项目,通常包含一个名为“default.xml”的文件。该文件包含有关所有项目及其相关git存储库位置的信息。该文件也是有版本控制的,因此当您使用“repo init -b XYZ”命令时,它将被还原,并且您可以返回到旧分支,这些旧分支可能与主分支相比已添加/删除了git项目。

这里是一个链接,指向描述清单格式的git repo文档:

https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md


固定链接(回到2015年) - satur9nine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接