Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > There's no easy out of the box way to do exactly what you've > described. A few things come to mind: > ... Wouldn't it suffice to have a cron job that runs something like D=$(date +"%Y-%m-%d") git fetch $serving "refs/*:refs/backup-$D/*" on the back-up box to fetch from the repository on the box the end-users push into once a day? In the back-up repository, the refs/backup-2018-11-25/heads/master reference would be today's tip of the master branch of the serving repository. You can set the expiry timeout to "now" (i.e. "gc" will immediately drop unreachable objects, and that is fine because you expicitly have refs to pin these objects anyway), get the dedup from "git fetch" for free, repack the backup repository as a whole, and dropping the whole refs/backup-2018-10-25/* hierarcy on 2018-11-25 is all you need to expire the refs. You may want to play with the ref-advertisement limiting options in the recent Git, if it is too much to grow the amount of "have"s by 30x for the common ancestry negotiation. But that is a small implementation detail.