Q: does index-pack work in place on windows?
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 2, 2011, 20:21 UTC
- Message-ID
- <7v39o6xk5q.fsf@alter.siamese.dyndns.org>
... 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-*.packthere 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.