如何在Mercurial中非交互式提交选中的文件代码块?
Mercurial 非交互式提交指定代码块实现方案
完全可以通过官方公开CLI接口实现该需求,无需调用内部不稳定的Python API,核心逻辑和Git的补丁应用流程类似,具体实现步骤如下:
操作流程
- 第一步:将用户选中的代码块生成标准Mercurial兼容格式的diff补丁,补丁结构和
hg diff输出格式对齐即可,需要包含正确的文件路径标识 - 第二步:备份当前工作区所有未提交改动,两种通用可选方式:
- 优先使用内置stash功能:执行
hg stash push,自动备份所有改动并重置工作区到最近提交的干净状态 - 兼容旧版本方案:执行
hg diff > full_backup.patch && hg revert --all,手动备份全量改动再重置工作区
- 优先使用内置stash功能:执行
- 第三步:应用仅包含选中代码块的补丁,支持直接从标准输入读入补丁内容(无需生成临时文件,更适合插件开发):
加# 从文件读入 hg import --no-commit 你的补丁文件路径 # 从标准输入读入 cat 补丁内容 | hg import --no-commit ---no-commit参数可以先不执行提交,方便插件做冲突校验、提交信息编辑等后续处理 - 第四步:校验补丁应用无冲突后,执行
hg commit -m "用户填写的提交信息"完成选中代码块的提交 - 第五步:恢复之前备份的剩余未提交改动,对应第二步的两种备份方式:
- 对应stash备份:执行
hg stash pop - 对应手动备份:执行
hg import --no-commit full_backup.patch && rm full_backup.patch
- 对应stash备份:执行
异常处理
如果补丁应用过程中出现冲突,直接执行hg import --abort即可终止操作,自动恢复工作区到应用补丁前的状态,你可以将冲突信息返回给用户做调整。
如果不需要中间编辑提交信息、校验的步骤,也可以直接去掉--no-commit参数,hg import会直接把补丁内容作为一次新的提交。
内容的提问来源于stack exchange,提问作者spaceghost
相关产品推荐
相关产品推荐

