使用hg convert迁移Mercurial仓库时如何保留原hg id?
解决Mercurial移除文件并保障团队协作的方案
核心逻辑说明
Mercurial的变更集哈希是基于变更集全部内容(含文件列表、文件内容、提交信息、父变更集等)计算的,只要移除文件,变更集内容就会改变,原哈希不可能被保留。hg convert的preserve-hash参数仅能在变更集内容完全一致时保留哈希,你的场景下因文件被移除,必然生成新哈希,这是Mercurial的设计特性。
具体操作方案
方案1:不修改历史(推荐,无协作风险)
如果不需要彻底从历史中删除文件,仅需当前版本移除:
- 在本地
og_local仓库中执行文件移除命令:hg remove <目标文件路径> - 提交移除操作:
hg commit -m "移除冗余文件:xxx" - 推送到中央仓库:
hg push
团队成员拉取后即可同步该变更,不会出现哈希冲突或历史分叉。
方案2:修改历史(需团队配合,用于敏感文件彻底清理)
若必须从所有历史中删除文件,需同步团队操作:
- 在本地
og_local仓库中启动历史编辑:hg histedit -r <需要修改的起始变更集ID> - 在打开的编辑器中,将目标变更集的操作改为
edit,保存退出后,移除对应文件:hg remove <目标文件路径> - 提交修改后的变更集:
hg commit --amend - 完成
histedit流程,直到所有包含目标文件的历史变更集都修改完毕。 - 强制推送到中央仓库(必须提前通知团队备份本地仓库):
hg push --force - 团队成员需重新克隆仓库,或执行
hg pull --force后清理本地未同步的变更。
关于你的hg convert操作补充
你通过convert生成的new_local仓库是全新的历史分支,哈希自然完全不同。如果已将其推送到服务器,需先回滚服务器仓库至原状态,再采用上述方案操作。
内容的提问来源于stack exchange,提问作者frank_crane
相关产品推荐
相关产品推荐

