Alexander Nestorov <alexandernst@xxxxxxxxx> 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. Indeed: $ 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 http://www-verimag.imag.fr/~moy/ -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html