Restore a file's modification time in Git
Solution 1:
Restore the modificaton time of a list of files to the author date of the their last commit with
gitmtim(){ local f;for f;do touch -d @0`git log --pretty=%at -n1 -- "$f"` "$f"; done;}; gitmtim configure.ac
It will not change directories recursively, though.
If you want to change a whole working tree, e.g. after a fresh clone or checkout, you may try
git log --pretty=%at --name-status --reverse | perl -ane '($x,$f)=@F;next if !$x;$t=$x,next if !defined($f)||$s{$f};$s{$f}=utime($t,$t,$f),next if $x=~/[AM]/;'
NB: I grepped for utime in builtin/clone.c and got no matches.
Solution 2:
Git does not do this. Like your linked FAQ says, it would break using timestamp-based dependency analysis tools like make.
Think about what would happen if old timestamps were applied to files checked out from ‘old’ commits:
- make from a clean directory works fine
- checkout an older branch/tag/commit (the files would have timestamps older than the build products now!)
- make now does nothing, because all the build products are newer than their dependencies
But, if you really want it, all the information is there. You could write your own tool to do it.
In your case, just use something like touch -r configure configure.ac
to reset the modification time of only configure.ac
, (or bring configure forward in time with touch configure
).
Actually, this is an easy “exercise for the reader” if you want to practice reading C code. The function that changes timestamps is utime
or utimes
. Search the code for uses of those functions (hint: git grep utime
in a git.git clone). If there are some uses, analyze the code paths to find out when it updates timestamps.