git分支切换时的时间戳问题
1、为什么git仓库没有保留文件修改时的时间戳?
摘自:https://git.wiki.kernel.org/index.php/Git_FAQ#Why_isn.27t_Git_preserving_modification_time_on_files.3F
Why isn't Git preserving modification time on files?
Modification time on files is a feature that affects build tools.
Most build tools compare the timestamp of the source(s) with the timestamp of the derived file(s).
If the source is newer, then a rebuild takes place, otherwise nothing happens. This speeds up the build process a lot.
Now consider what would happen if you check out another branch, and modification times were preserved. We assume you already have a fully-built project.
If a source file on that other branch has a timestamp that is older than that of the corresponding derived file, the derived file will not be built even if it is different, because the build system only compares modification times.
At best, you'll get some kind of weird secondary error; but most likely everything will look fine at first, but you will not get the same result as you would have with a clean build. That situation is unhealthy since you really do not know what code you are executing and the source of the problem is hard to find.
You will end up always having to make a clean build when switching branches to make sure you are using the correct source.
(Git bisect is another Git procedure that checks out old and new revisions where you need a reliable rebuild.)
Git sets the current time as the timestamp on every file it modifies, but only those. The other files are left untouched, which means build tools will be able to depend on modification time and rebuild properly. If build rules change, that can cause a failure anyway, but that is a far less common problem than accidentally not rebuilding.
2、为什么git仓库仅仅保留change commit 的修改时间戳信息,而没有保留文件的时间戳信息?
摘自:https://stackoverflow.com/questions/2179722/checking-out-old-file-with-original-create-modified-timestamps
I believe that the only timestamps recorded in the Git database are the author and commit timestamps. I don't see an option for Git to modify the file's timestamp to match the most recent commit, and it makes sense that this wouldn't be the default behavior (because if it were, Makefiles wouldn't work correctly).
You could write a script to set the modification date of your files to the the time of the most recent commit. It might look something like this:
IFS=" " for FILE in $(git ls-files) do TIME=$(git log --pretty=format:%cd -n 1 --date=iso -- "$FILE") TIME=$(date -j -f '%Y-%m-%d %H:%M:%S %z' "$TIME" +%Y%m%d%H%M.%S) touch -m -t "$TIME" "$FILE" done