Subject: [PATCH 0/9] Multiple remotes without conflicts

From: Andreas Gruenbacher <[email-masked]>
Date: Thu, 18 Mar 2010 12:52:43 +0100

Hello,

I'm still trying to find a simple and painless way of sharing the object
store among multiple repositories: the idea is to have a "parent"
repository which contains the actual object store, and a number of
"child" repositories which link to that object store.  The obvious
problem is garbage collection: we can only garbage collect the parent
once it has all refs of all its children.

One way of ensuring that is to make each child a "remote" of the parent,
and to fetch all remotes first.  This works for branches, but not for
tags or for the reflog.

The problem with tags is that they all share the same namespace (they
are fetched with +refs/tags/*:refs/tags/*).  The obvious fix seems to be
to use a different refspec for tags, but with the built-in default
refspec, tags are then fetched twice (for example, with
+refs/*:refs/remotes/<remote>/*, refs/tags/foo is fetched as
refs/remotes/<remote>/tags/foo as well as refs/tags/foo).  Also, when
tags are included in refspecs, automatic tag fetching and the --tags and
--no-tags options break.

This patch series fixes this, and makes refspecs which match tags work
in a reasonable way.  (There may be problems with pruning still; I did
not look into that, yet.)

The other issue is that the "parent" won't know about things
referenced in the child's reflog.  This is not an issue for the setup I
have in mind because the children won't have reflogs (they will only be
accessed remotely), so I have not addressed this so far.

Here is an example for setting up a shared object store:

	TOP=$PWD
	mkdir ab a b

	cd $TOP/ab
	git init --bare
	for x in a b; do
		git remote add $x ../$x
		git config --unset remote.$x.fetch
		git config --add remote.$x.fetch "+refs/*:refs/remotes/$x/*"
	done

	for x in a b; do
		cd $TOP/$x
		git init
		git config gc.auto 0
		rm -r .git/objects
		ln -s ../../ab/objects .git/objects
	done

Comments welcome!

Thanks,
Andreas

---

Andreas Gruenbacher (9):
  fetch: Check for a "^{}" suffix with suffixcmp()
  fetch: Properly initialize refspec on stack
  fetch: Fix minor memory leak
  fetch: Move deepening fetch check into builtin/fetch.c
  fetch: Move loop checking which refs we have already
  fetch: Check if all objects exist after fetching
  fetch: Use the same ref map for all branches and tags
  fetch: Don't fetch tags twice
  fetch: Make automatic tag following work with arbitrary refspecs

 builtin/fetch.c |  430 ++++++++++++++++++++++++++++++++-----------------------
 cache.h         |    4 +-
 transport.c     |   38 ++----
 3 files changed, 264 insertions(+), 208 deletions(-)