From: Erik Faye-Lund Date: Wed, 02 Feb 2011 20:30:15 GMT Subject: Re: Q: does index-pack work in place on windows? Message-ID: In-Reply-To: <7v39o6xk5q.fsf@alter.siamese.dyndns.org> On Wed, Feb 2, 2011 at 9:21 PM, Junio C Hamano wrote: > ... or any other (operating / file) system where you cannot unlink a file > that is open? > > When you run > >    $ git clone git://some.where/repo/sitory.git local >    $ cd local >    $ git index-pack .git/objects/pack/pack-*.pack > > there is a call to write_idx_file() in builtin/index-pack.c, that feeds > the correct (and existing) name of the corresponding pack idx file. > > The callee in pack-write.c, after sorting the list of objects contained in > the pack, does this: > >        if (!index_name) { >                static char tmpfile[PATH_MAX]; >                fd = odb_mkstemp(tmpfile, sizeof(tmpfile), "pack/tmp_idx_XXXXXX"); >                index_name = xstrdup(tmpfile); >        } else { >                unlink(index_name); >                fd = open(index_name, O_CREAT|O_EXCL|O_WRONLY, 0600); >        } > > and then writes out the pack index to the file descriptor.  But index-pack > uses the usual has_sha1_file() and read_sha1_file() interface to validate > the "existing" objects, and is likely to have mmapped the .idx file when > it called use_pack_window().  Which makes me suspect that this unlink (or > the open that immediately follows) may fail on systems that do not allow > unlink on inode that has still users. ...and you're right: $ git index-pack .git/objects/pack/pack-d634271f4d7ca70c00148e967a343c3c46cd7705.pack Unlink of file '.git/objects/pack/pack-d634271f4d7ca70c00148e967a343c3c46cd7705.idx' failed. Should I try again? (y/n)? n fatal: unable to create '.git/objects/pack/pack-d634271f4d7ca70c00148e967a343c3c46cd7705.idx': File exists