Android源代码是一个由许多 git仓库 组成的庞大层级结构。它们由一个名为repo的自定义脚本进行管理。Repo使用manifest.xml确定要管理哪些git仓库。Android的manifest.xml与所有其他git仓库一起托管在一个git仓库中。
在Android中,这个仓库是如何管理的?具体来说,不同分支和每个分支中的不同文件是如何组织的?
Android源代码是一个由许多 git仓库 组成的庞大层级结构。它们由一个名为repo的自定义脚本进行管理。Repo使用manifest.xml确定要管理哪些git仓库。Android的manifest.xml与所有其他git仓库一起托管在一个git仓库中。
在Android中,这个仓库是如何管理的?具体来说,不同分支和每个分支中的不同文件是如何组织的?
首先,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 sync
为 manifest.xml
和 local_manifest.xml
中的每个项目克隆 Git 仓库到 .repo/projects
,创建带有指向对应裸仓库的符号链接的工作目录,检出在清单中指定的分支,并更新 .repo/project.list
。如果项目已经存在,则情况略有不同,基本上执行 git pull --rebase
。
这里是一个链接,指向描述清单格式的git repo文档:
https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md
.git
内容存储在.repo / projects /
内部有什么好处? - Hamyrepo
背后的人为什么选择了他们的方法。在某些版本的repo
中,可以在不同的构建树之间共享.repo/projects
目录,这在硬盘较小的笔记本电脑上非常方便。但是这从未得到支持,我也不确定它是否还能用。 - Pekka Nikander.repo/manifests/.git/<element>
(如objects
、refs
等)都是符号链接到.repo/manifests.git/<element>
,而不是将整个.git
目录符号链接。 - phi1010