Theodore Tso <tytso@xxxxxxx> 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. - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html