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
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.