Alexander Nestorov <> writes:

> I'm not trying to ignore the x bit, what I'm trying to do is make
> "git reset" checkout only the files that actually changed instead
> of checking out all the files with different permissions than the
> ones git thinks they should have.

Ah, OK, you want "git reset --hard" to just do a chmod, which would not
touch the file's mtime (but only the ctime).

Then, it's even easier to demonstrate: just "touch" instead of chmod.

$ touch myfile; sleep 2                        
$ strace -f git reset --hard 2>&1 | grep myfile
lstat("myfile", {st_mode=S_IFREG|0755, st_size=5, ...}) = 0
lstat("myfile", {st_mode=S_IFREG|0755, st_size=5, ...}) = 0
unlink("myfile")                        = 0
open("myfile", O_WRONLY|O_CREAT|O_EXCL, 0777) = 4

(sleep 2 is needed in the demonstration to avoid the "racy git"
safeties, but it's not really important)

Git doesn't even try to read the file content: once it detected that the
stat information changed, it rewrite the file without looking at its
content. It's faster this way for files that actually changed.

> Said with other word: when you run "git reset", git does a "status"
> and checkouts all the files that showed up from the "status".

No, it's indeed the opposite: "status" re-checks the content of changed
files, and update the stat-cache in the index accordingly if the content
actually didn't change.

Runing "git status" before "git reset --hard" should solve your problem.
The part of "git status" of interest is "git update-index --refresh":

$ touch myfile; sleep 2                        
$ git update-index --refresh
$ strace -f git reset --hard 2>&1 | grep myfile
lstat("myfile", {st_mode=S_IFREG|0755, st_size=5, ...}) = 0

Matthieu Moy
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

Reply via email to