How does the Android repo manifest repository work?
Asked Answered
J

2

54

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?

Jeremiahjeremias answered 27/5, 2011 at 8:33 Comment(0)
P
68

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:

  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  

You can trace what really happens with repo --trace init ...

Then, repo sync clones git repositories to .repo/projects for each project in manifest.xml and local_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 a git pull --rebase.

Plosive answered 8/8, 2012 at 18:4 Comment(4)
Would love to hear the explanation for why they do things this way! In particular, what is the benefit of storing all the .git contents inside of .repo/projects/?Misery
I have no idea why the folks behind repo chose the approach they did. With some versions of repo, it was possible to share the .repo/projects directory between different build trees, which was kind-of handy on a laptop with a small hard drive. But that was never supported, and I'm not sure if it works any more.Plosive
@Misery - it allows one to rm -fr a visible project build directory without losing the git objects, so a subsequent repo sync will be fast.Tickler
For clarification: Most elements .repo/manifests/.git/<element> (such as objects, refs and such) are symlinked to .repo/manifests.git/<element>, instead of symlinking the whole .git directory.Plio
A
9

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 git repo document describing the manifest format:

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

Altman answered 11/5, 2012 at 9:10 Comment(1)
Fixed link (back in 2015)Altman

© 2022 - 2024 — McMap. All rights reserved.