From: Eran Tromer Date: Fri, 27 Oct 2006 02:42:13 GMT Subject: Re: fetching packs and storing them as packs Message-ID: <45417205.6020805@tromer.org> In-Reply-To: <20061027014229.GA28407@spearce.org> On 2006-10-27 03:42, Shawn Pearce wrote: > Nicolas Pitre wrote: >> On Fri, 27 Oct 2006, Eran Tromer wrote: >> Well, the race does exist. Don't do repack -a -d at the same time then. > > This is an issue for "central" repositories that people push into > and which might be getting repacked according to a cronjob. AFAICT, the bottom line of the "Re: auto-packing on kernel.org? please?" thread last October was "sure, go ahead". > Unfortunately I don't have a solution. I tried to come up with > one but didn't. :-) Here's one way to do it. Change git-repack to follow references under $GIT_DIR/tmp/refs/ too. To receive or fetch a pack: 1. Add references to the new heads in `mktemp $GIT_DIR/tmp/refs/XXXXXX`. 2. Put the new .pack under $GIT_DIR/objects/pack/. 3. Put the new .idx under $GIT_DIR/objects/pack/. 4. Update the relevant heads under $GIT_DIR/refs/. 5. Delete the references from step 1. This is repack-safe and never corrupts the repo. The worst-case failure mode is if you die before cleaning the refs from $GIT_DIR/tmp/refs. That may mean some packed objects will never be removed by "repack -a -d" even if they lose all references from $GIT_DIR/refs, so do "tmpwatch -m 240 $GIT_DIR/tmp/refs" to take care of that. Eran