如何避免git pull --rebase --autostash总是更新本地修改文件的时间戳?
解决Git Pull Rebase Autostash更新文件时间戳的问题
核心原因
git pull --rebase --autostash 执行时,Git会先暂存本地修改,完成rebase后再恢复这些修改。即便文件内容完全没变化,Git恢复暂存内容时也会重新写入文件,导致文件的修改时间戳(mtime)更新,触发不必要的全量构建。
可行解决方案
方案1:手动拆分流程,避免自动暂存的强制写入
放弃--autostash参数,手动处理暂存、拉取、rebase和恢复:
- 暂存本地修改(不保留索引状态,确保恢复时仅在内容变化时写入文件):
git stash push --no-keep-index - 拉取远程最新提交:
git fetch origin - 基于远程分支执行rebase:
git rebase origin/<你的分支名> - 恢复暂存的本地修改:
git stash pop
这种方式下,Git会对比文件内容,只有当内容确实有差异时才会重新写入文件,不会无故更新时间戳。
方案2:修改Git配置,让恢复操作保留原有时间戳
通过配置让Git在恢复暂存内容时,仅当文件内容变化时才更新时间戳:
git config --local core.trustctime false
该配置会让Git忽略文件的更改时间(ctime),仅通过文件内容的哈希值判断是否需要更新文件。后续执行git pull --rebase --autostash时,若文件内容未变,Git不会重新写入文件,时间戳也就不会被修改。
方案3:使用rebase的自动暂存但跳过不必要的文件写入
如果坚持使用--autostash,可以在rebase完成后,用脚本检查并恢复内容未变文件的原始时间戳:
- 执行拉取rebase:
git pull --rebase --autostash - 找出内容未变但时间戳更新的文件并恢复时间戳:
git status --porcelain | grep '^ M' | awk '{print $2}' | while read file; do if git diff --quiet HEAD -- "$file"; then git checkout HEAD -- "$file" fi done
这个脚本会检查所有被标记为修改的文件,若内容和HEAD一致,就从HEAD中检出文件(仅恢复时间戳,不改变内容)。
内容的提问来源于stack exchange,提问作者Spongman
相关产品推荐
相关产品推荐

