如何拆分Mercurial中同时包含文件移动与修改的单个提交
Mercurial 拆分混合文件移动与内容修改的提交方案
不需要手动备份文件,直接基于hg的提交记录就能自动完成拆分,全程不会引入无关操作,步骤如下:
前置准备
先确认你要拆分的目标提交版本号,下文统一用TARGET_REV指代该版本,操作前先打个备份标记,避免操作失误丢内容:
hg bookmark split_op_backup
步骤1:切到目标提交的父版本
回到还没做任何移动、修改的干净基线:
hg update TARGET_REV^
步骤2:生成纯文件移动的提交
直接从目标提交的记录里提取所有文件移动映射,批量执行hg mv完成纯路径变更,这一步不会带任何内容修改:
hg log -vpr TARGET_REV | grep -E '^rename (from|to)' | paste - - | sed -E 's/rename from (.*)rename to (.*)/\1 \2/' | while read old_path new_path; do hg mv "$old_path" "$new_path"; done
执行完可以跑hg status校验:所有变更都是成对的「新增新路径文件、删除旧路径文件」,没有标记为M的修改项,就说明纯移动操作正确。
校验通过后提交第一个版本:
hg commit -m "完成文件路径迁移(无内容修改)"
记下来这个新提交的版本号,下文用MOVE_ONLY_REV指代。
步骤3:生成内容修改的提交
现在文件已经在正确路径下,但内容还是移动前的旧版本,直接把目标提交里的文件内容同步过来,剩下的就全是内容修改,不会有路径变更:
hg revert --all -r TARGET_REV
再跑一次hg status确认,所有变更都是M(文件修改)状态,没有新增/删除项,就可以提交第二个版本:
hg commit -m "完成迁移后文件的内容调整"
后续收尾
- 如果原来的
TARGET_REV后面还有其他跟进提交,直接用hg rebase把后续提交全部变基到你刚生成的第二个拆分提交上,再用hg strip TARGET_REV删掉原来的混合提交即可 - 如果操作中途出错,直接
hg update split_op_backup就能回到操作前的状态重来 - 如果要拆分的提交里移动的文件数量很少,也可以跳过批量提取rename的命令,手动对每个移动的文件执行
hg mv 旧路径 新路径,效果完全一致
内容的提问来源于stack exchange,提问作者user1780424
相关产品推荐
相关产品推荐

