The Android source is managed by repo. When syncing using repo, a directory called .repo/projects/
is created, which contains all the git repositories also checked out directly in the current working directory, just in bare git format.
For what purpose does repo maintain the bare git repositories? And how are these bare repositories used by repo?
(NB: Clarification: I am not talking about a git repository when I write "repo", I am talking specifically about the script called repo
created by/for Android for maintaining all the git repositories comprising the Android source.)
After working with the Android repo manifest system for a while, I think I now understand the purpose of the bare repositories in the .repo/projects/
directory.
As already answered by @Fredrik the projects there are not another copy of the repositories represented directly in the "clone" created by repo
. In fact the content of all the .git
directories in the clone are just symlinks, like this:
$ ll development/.git/
total 452
drwxr-xr-x 2 bfh bfh 4096 2011-08-15 13:55 ./
drwxr-xr-x 20 bfh bfh 4096 2011-08-15 13:55 ../
lrwxrwxrwx 1 bfh bfh 43 2011-08-15 13:55 config -> ../../.repo/projects/development.git/config
lrwxrwxrwx 1 bfh bfh 48 2011-08-15 13:55 description -> ../../.repo/projects/development.git/description
-rw-r--r-- 1 bfh bfh 41 2011-08-15 13:55 HEAD
lrwxrwxrwx 1 bfh bfh 42 2011-08-15 13:55 hooks -> ../../.repo/projects/development.git/hooks/
-rw-r--r-- 1 bfh bfh 449008 2011-08-15 13:55 index
lrwxrwxrwx 1 bfh bfh 41 2011-08-15 13:55 info -> ../../.repo/projects/development.git/info/
lrwxrwxrwx 1 bfh bfh 41 2011-08-15 13:55 logs -> ../../.repo/projects/development.git/logs/
lrwxrwxrwx 1 bfh bfh 44 2011-08-15 13:55 objects -> ../../.repo/projects/development.git/objects/
lrwxrwxrwx 1 bfh bfh 48 2011-08-15 13:55 packed-refs -> ../../.repo/projects/development.git/packed-refs
lrwxrwxrwx 1 bfh bfh 41 2011-08-15 13:55 refs -> ../../.repo/projects/development.git/refs/
lrwxrwxrwx 1 bfh bfh 45 2011-08-15 13:55 rr-cache -> ../../.repo/projects/development.git/rr-cache/
lrwxrwxrwx 1 bfh bfh 40 2011-08-15 13:55 svn -> ../../.repo/projects/development.git/svn
Thus the actual git repositories are only represented once in a clone.
The reason for keeping a bare and a normal git are then because of the way the manifest system works. The manifest system is a way of specifying a collection of gits that will be checked out, and in which version they will be checked out. The manifest file is itself maintained in a git, and the repo command allows changing the branch of that manifest git as you please.
Thus to allow a (fast) way of removing and adding gits depending on what is currently picked in the manifest file, repo can just keep all the gits you have ever cloned in the .repo/projects
folder, and then only copy them to the "normal" clone area if they are chosen in the current branch of the manifest file.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With