Subject: Re: repo.or.cz wishes?

From: "Shawn O. Pearce" <[email-masked]>
Date: Fri, 31 Aug 2007 17:09:39 -0400

Theodore Tso <[email-masked]> wrote:
> On Wed, Aug 29, 2007 at 12:15:23AM -0400, Shawn O. Pearce wrote:
> > > 
> > > git --git-dir=A gc
> > > ln A/.git/objects/pack/* B/.git/objects/pack
> > > git --git-dir=B gc --prune
> > > git --git-dir=A prune
> > 
> > No, it won't work.
> > 
> > The problem is that during the first `git --git-dir=A gc` call
> > you are deleting packfiles that may contain objects that B needs.
> > *poof*.  
> 
> But "git-gc" without the --prune doesn't delete any objects.

Yes, it does delete objects.  Even without --prune.  That is
because git-gc is running `git-repack -a -d -l`.  repack -a means
repack all objects reachable from the current refs.  The -d means
delete the packfiles that existed when the repack started, as it
is assumed that all needed (reachable) objects were copied into
the new output packfile(s).  The -d also means delete any loose
objects that are now packed (git-prune-packed).

Yet there may be objects in A that A cannot reach anymore (deleted
or rewound branch) but that B needs and B does not have a copy of.
If these objects were in one of the prior packfiles of A and is
not in the new packfile(s) of A then those objects are gone.  *poof*.

> So it
> should always be safe to use git-gc even if there are repositories
> that are relying on that repo's ODB.  It's only if you use git-gc
> --prune that you could get in troudble.  It might delete some
> packfiles containing objects needed by B, but only after consolidating
> all of the objects into a single packfile that contains all of the
> objects that had always been in A's ODB.

But when we repack we don't repack everything in A's ODB, we only
repack the things that A can reach.  If A cannot reach something
because a branch was rewound or deleted it won't survive the repack.
Then the repack is behaving like at least partially like gc --prune.
 
> So I don't see why this wouldn't work.

It only works if A cannot delete a branch or rewind a branch.
In other words, once an object is stored in A's ODB it must always
be reachable from A's refs.

-- 
Shawn.