The Android source is a large hierarchy of git repositories. They are managed by a custom script called repo. Repo determines which git repositories to manage using a manifest.xml. The manifest.xml of Android is hosted in a git repository along with all the other git repositories.
How is this repository managed in Android? Specifically how are the different branches and the different files hosted in each branch organised?
First, repo init creates the
.repo
directory, clones the git repository https://android.googlesource.com/tools/repo to.repo/repo
, and the git repository specified with the-u
option to a bare repository at.repo/manifests.git
. After that, it creates the.repo/manifests
directory, converts it into a git repository through creating symbolic links from.repo/manifests/.git
to.repo/manifests.git
. It then checks out the branch specified in-b
, and creates a symbolic link.repo/manifest.xml
pointing to the specified file (-m
option) in.repo/manifests
, by default.repo/manifests/default.xml
.Roughly as follows:
You can trace what really happens with
repo --trace init ...
Then, repo sync clones git repositories to
.repo/projects
for each project inmanifest.xml
andlocal_manifest.xml
, creates working directories with.git
having symlinks to the corresponding bare repository, checks out the branch specified in the manifest, and updates.repo/project.list
. The case where the projects are already there is slightly different, essentially performing agit pull --rebase
.At the root of the repo is a hidden directory named ".repo", inside you will find a git project named "manifests" which usually contains a file named "default.xml". This file contains information about all the projects and where their associated git repositories are located. This file is also versioned thus when you use the "repo init -b XYZ" command it will be reverted and you can back to older branches that may have added/removed git projects compared to the head.
Here is a link to the repo git repo document describing the manifest format:
https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.txt
let's see here:
I found out, in that link, many interesting details