On Wed, 2 Feb 2011, Erik Faye-Lund wrote: > On Wed, Feb 2, 2011 at 9:21 PM, Junio C Hamano <gitster@xxxxxxxxx> 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 Why would you do such thing in the first place? If the pack exists along with its index on disk, there is no point recreating it. Maybe index-pack should just bail out early in that case. Nicolas