On Thu, Mar 09, 2023 at 10:35:46AM -0500, Jeff King wrote: > You may want to try the "preciousObjects" repository extension, which > was designed to prevent accidents for a case like this. Something like: > > [this will cause old versions of Git that don't understand > extensions.* to bail on all commands for safety] > $ git config core.repositoryformatversion 1 > > [this will tell old versions of Git that don't understand this > particular extension to bail on all commands for safety. But more > importantly, it will tell recent versions (> 2.6.3) to allow most > commands, but not ones that would delete unreachable objects] > $ git config extensions.preciousObjects true > > [this is it in action] > $ git repack -ad > fatal: cannot delete packs in a precious-objects repo > $ git prune > fatal: cannot prune in a precious-objects repo > > Sadly it's not quite smart enough to realize that "git repack -adk" is > safe. If you want to occasionally repack with that, you'd have to > manually disable the flag for a moment. > > I will also say that while I implemented this extension a while back, it > never actually saw production use for my intended case. So I think it's > pretty good (and certainly safer than nothing), but it's not thoroughly > tested in the wild. We use it in grokmirror for objstore repositories [1] (the super-parents of all forks), as a precautionary measure against a sysadmin running any kind of manual operation that may result in loose objects being deleted. I do believe it works well for that purpose. -K [1] https://github.com/mricon/grokmirror#object-storage-repositories