Git变基时未变更的本地修改文件修改时间被更新,如何保留?
解决Git变基后本地修改文件时间戳被更新的问题
针对你使用Git 2.18.0时遇到的变基场景:本地修改文件(内容未被变基影响)时间戳仍被更新,进而触发全量构建的问题,提供以下几种可行方案:
1. 跳过无必要的变基操作(针对分支无提交变更场景)
如果待变基分支自上次变基后没有任何提交变更,可先判断分支与目标分支的差异,直接跳过变基,从根源避免时间戳被修改:
# 替换<target>为你要变基的目标分支(如origin/master) if git diff --quiet <target> HEAD; then echo "当前分支与目标分支无差异,无需执行变基" else git rebase <target> fi
2. 手动暂存+恢复时保留时间戳
通过手动暂存本地修改、备份时间戳的方式,确保变基后文件修改时间不被覆盖:
步骤1:备份本地修改文件的时间戳
# 收集所有本地已修改文件的时间戳,保存到临时文件 git status --porcelain | grep '^ M' | awk '{print $2}' | while read file; do stat -c "%Y %n" "$file" >> .git_mtime_backup done
步骤2:暂存修改并执行变基
git stash push -m "temp stash for rebase" git rebase <target>
步骤3:恢复本地修改和原时间戳
git stash apply --index # 恢复文件原时间戳 cat .git_mtime_backup | while read ts file; do touch -d "@$ts" "$file" done rm .git_mtime_backup
3. 变基后回滚文件时间戳
如果已经完成变基,且确认文件内容未发生变更,可从变基前的HEAD恢复文件的原时间戳:
# 遍历所有变基后仍处于修改状态的文件 git status --porcelain | grep '^ M' | awk '{print $2}' | while read file; do # 从变基前的HEAD(HEAD@{1})获取文件原时间戳并设置 git show HEAD@{1}:"$file" > /tmp/git_temp_file touch -r /tmp/git_temp_file "$file" rm /tmp/git_temp_file done
补充说明
你遇到的Git FAQ描述与实际行为的差异,是因为FAQ中“修改过的文件”指的是变基过程中Git主动修改内容的文件;而本地修改的文件在变基时会被暂存后恢复,这个恢复过程会触发文件重写,导致修改时间被更新为当前时间,属于Git处理本地修改的流程特性。
内容的提问来源于stack exchange,提问作者Maxim Yanchenko
相关产品推荐
相关产品推荐

