On Wed, May 16, 2018 at 10:58:19AM -0400, Konstantin Ryabitsev wrote: > The parent repo is not keeping track of any other repositories that may > be using it for alternates, which is why you basically: > > 1. never run auto-gc in the parent repo > 2. repack it manually using -Ad to keep loose objects that other repos > may be borrowing (but we don't know if they are) > 3. never prune the parent repo, because this may delete objects other > repos are borrowing > > Very infrequently you may consider this extra set of maintenance steps: > > 1. Find every repo mentioning the parent repository in their alternates > 2. Repack them without the -l switch (which copies all the borrowed > objects into those repos) > 3. Once all child repos have been repacked this way, prune the parent > repo (it's safe now) > 4. Repack child repos again, this time with the -l flag, to get your > savings back. You can also do periodic maintenance like: 1. Copy each ref in the forked repositories into the parent repository (e.g., giving each child that borrows from the parent its own hierarchy in refs/remotes/<child>/*). 2. Repack the parent as normal. It will retain any objects referenced by the children (because they are now referenced by it). But note that: 1. It's not atomic with respect to updates in the child repos (but then, neither is the single-repo case!). 2. It doesn't know about reflogs or the index in the child repositories. This is more or less how we use alternates at GitHub. > I would heartily love a way to teach git-repack to recognize when an > object it's borrowing from the parent repo is in danger of being pruned. > The cheapest way of doing this would probably be to hardlink loose > objects into its own objects directory and only consider "safe" objects > those that are part of the parent repository's pack. This should make > alternates a lot safer, just in case git-prune happens to run by accident. If you set: git config core.repositoryformatversion 1 git config extensions.preciousObjects true in the parent, git-prune (repack -d) will refuse to run. That doesn't solve the problem of how to repack, but it can help prevent accidental misuse. -Peff