如何在Mercurial中基于历史修订版分支并迁移独立修改?
解决方案
针对你的场景,这里提供几个可行的方案,核心思路是在主仓库中基于修订版2462创建独立分支,再将副本的定制修改迁移到该分支,完全隔离主仓库后续的代码提交:
方案一:补丁导出导入法
这是最通用的方法,无需依赖扩展,适合所有Mercurial版本:
- 在副本仓库导出定制补丁
- 命令行:假设副本中从修订版2463开始是你的定制提交,执行
hg export -o custom-patch-%n.diff -r 2463::tip,会生成多个按顺序命名的补丁文件。 - TortoiseHg操作:右键副本仓库 → 「导出」→ 选择提交范围为「从2463到最新」,设置输出格式为patch文件,保存到本地目录。
- 命令行:假设副本中从修订版2463开始是你的定制提交,执行
- 在主仓库创建目标分支
- 命令行:先切换到修订版2462
hg update -r 2462,再创建分支hg branch custom-client,最后提交分支创建hg commit -m "Create custom-client branch based on r2462"。 - TortoiseHg操作:在仓库历史界面找到r2462,右键 → 「更新到这里」;顶部菜单 → 「分支」→ 「创建分支」,输入分支名
custom-client并提交。
- 命令行:先切换到修订版2462
- 在主仓库应用补丁
- 命令行:执行
hg import custom-patch-*.diff,按补丁编号顺序导入即可。 - TortoiseHg操作:右键主仓库 → 「导入」→ 选择之前导出的所有patch文件,批量导入。
- 命令行:执行
方案二:使用Transplant扩展(更高效)
该扩展专门用于跨分支/仓库移植提交,操作更简洁:
- 启用Transplant扩展
打开主仓库的.hgrc(或Mercurial.ini)文件,添加以下配置:[extensions] transplant = - 在主仓库创建目标分支
同方案一的步骤2,基于r2462创建custom-client分支并提交。 - 关联副本仓库并拉取提交信息
- 命令行:添加副本仓库为远程源
hg add remote custom-repo /path/to/your/copy/repo,然后拉取提交信息hg pull custom-repo。 - TortoiseHg操作:仓库界面 → 「设置」→ 「远程仓库」→ 「添加」,输入名称
custom-repo和副本仓库路径;然后执行「拉取」操作获取副本的提交历史。
- 命令行:添加副本仓库为远程源
- 移植定制提交到目标分支
- 命令行:执行
hg transplant -b default custom-repo,会将副本default分支上的定制提交全部移植到当前的custom-client分支。 - TortoiseHg操作:顶部菜单 → 「移植」→ 选择远程仓库
custom-repo的default分支,勾选所有定制提交后点击「移植」。
- 命令行:执行
方案三:直接推送/拉取分支(副本为克隆仓库时适用)
如果你的副本是直接从主仓库克隆的,且从未拉取过主仓库r2462之后的提交:
- 在副本仓库创建定制分支
- 命令行:执行
hg branch custom-client,提交分支创建hg commit -m "Mark custom changes as custom-client branch"。 - TortoiseHg操作:顶部菜单 → 「分支」→ 「创建分支」,输入
custom-client并提交。
- 命令行:执行
- 在主仓库拉取该分支
- 命令行:执行
hg pull /path/to/copy/repo -b custom-client,只拉取副本的custom-client分支。 - TortoiseHg操作:仓库界面 → 「拉取」→ 选择副本仓库路径,勾选「只拉取指定分支」,输入
custom-client后执行拉取。
- 命令行:执行
关键注意事项
- 操作前务必备份主仓库和副本仓库,避免数据丢失。
- 若定制修改与主仓库r2462之后的提交存在冲突,迁移时会提示冲突,这属于正常情况,需手动解决,并非「不必要的合并」。
- 后续如需将定制分支的修改合并到主仓库default分支,只需切换到default分支执行
hg merge custom-client,只会合并定制内容,不会引入无关代码。
内容的提问来源于stack exchange,提问作者AlexHomeBrew
相关产品推荐
相关产品推荐

