Git能否检测仅时间戳变更、内容未改的文件并重置时间戳?
Git 仅时间戳改动文件的检测与重置方案
Git默认不追踪文件的时间戳元数据,仅通过文件内容哈希判断是否存在改动,因此git status不会显示仅修改了时间戳、内容无变化的文件。针对检测这类文件、重置时间戳避免Makefile误触发重编译的需求,可按以下方法操作:
一键检测并重置(Git 2.29+ 适用)
Git 2.29及以上版本内置了专门的命令,直接运行即可完成扫描和重置:
# 自动扫描所有被追踪文件,识别内容无改动、仅修改时间变更的文件 # 将这类文件的修改时间重置为对应文件最后一次提交的时间 git restore-mtime
执行完成后,所有误触保存导致的时间戳异常都会被修正,Makefile不会再误判触发全量重编译。
仅列出异常文件不做修改
如果只需要查看存在时间戳异常的文件列表,运行以下命令:
git diff --raw --no-renames --diff-filter=M HEAD | awk '{print $6}' | xargs -I {} sh -c 'git hash-object -t blob {} 2>/dev/null | grep -q $(git rev-parse HEAD:{}) && echo {}'
命令会逐文件比对工作区文件与HEAD版本的内容哈希,仅输出内容完全一致、但时间戳存在异常的文件路径。
低版本Git兼容重置方案
如果使用的Git版本低于2.29,没有内置restore-mtime命令,可运行以下脚本实现同等效果:
git ls-files -z | xargs -0 -n1 -P 4 sh -c ' for f do if [ "$(git hash-object "$f")" = "$(git rev-parse "HEAD:$f")" ]; then mtime=$(git log -1 --format=%ct -- "$f") touch -d "@$mtime" "$f" fi done ' sh
该脚本的重置逻辑是将无内容改动的文件时间戳设置为该文件最后一次提交的时间,与Git checkout文件时的时间戳设置逻辑一致,不会改动实际有内容变更的文件,完全满足Makefile的时间判定规则。
内容的提问来源于stack exchange,提问作者lord_nimon
相关产品推荐
相关产品推荐

