Thread (1 message) 1 message, 1 author, 2016-06-15

Re: [RFC] git checkout $tree -- $path always rewrites files

From: Junio C Hamano <hidden>
Date: 2016-06-15 23:02:51

Duy Nguyen [off-list ref] writes:
On Fri, Nov 7, 2014 at 3:38 PM, Jeff King [off-list ref] wrote:
quoted
On Fri, Nov 07, 2014 at 03:13:24AM -0500, Jeff King wrote:
quoted
I noticed that "git checkout $tree -- $path" will _always_ unlink and
write a new copy of each matching path, even if they are up-to-date with
the index and the content in $tree is the same.
By the way, one other thing I wondered while looking at this code: when
we checkout a working tree file, we unlink the old one and write the new
one in-place. Is there a particular reason we do this versus writing to
a temporary file and renaming it into place?  That would give
simultaneous readers a more atomic view.

I suspect the answer is something like: you cannot always do a rename,
because you might have a typechange, directory becoming a file, or vice
versa; so anyone relying on an atomic view during a checkout operation
is already Doing It Wrong.  Handling a content-change of an existing
path would complicate the code, so we do not bother.
Not a confirmation, but it looks like Linus did it just to make sure
he had new permissions right, in e447947 (Be much more liberal about
the file mode bits. - 2005-04-16).
I think you are referring to the "... to get the new one with the
right permissions" comment in that patch, but I do not think that
affects the choice between (1) unlink and write anew to the final
and (2) create a new temporary and rename.  Either way, you do not
update the existing file in-place and try to checkout the permission
bits with chmod(2).
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help