2012-11-20 27 views
18

This answer显示了如何降级提交到补丁,但是如何才能将mq补丁仅转换为本地更改?如何仅将Mercurial队列修补程序转换为本地更改?

+0

对不起,但是mq-patch **已经是“仅本地更改”了,AFAIK。你为什么要更多东西? –

+4

“本地更改”是Mercurial术语,用于不在更改集中或由Mercurial修补程序跟踪的更改。可能有几个原因希望将补丁转换回本地更改。无论如何,我需要这样做几次,并没有找到堆栈溢出的答案,也没有通过谷歌搜索(我不得不RTFM),所以当我发现它的情况下分享了答案,以防其他人想要做同样的事情。 – Lstor

回答

21

简短的回答

确保将补丁应用,然后:

hg qrefresh nothing 
hg qpop --keep-changes 
hg qdelete "Name of patch" 

龙答案

首先,你需要确保没有变化由补丁跟踪。要做到这一点,使用

hg qrefresh nothing 

nothing仅仅是不是在仓库一个随机文件名。为简洁起见,我通常使用hg qref 0hg qrefresh接受可选的文件模式。如果提供了该补丁,补丁将跟踪与该模式相匹配的更改 - 仅限于那些补丁。如果没有与文件模式匹配的内容,修补程序将不跟踪更改,因此只会进行本地更改。

现在你有一个无用的补丁躺在周围,你有一些本地的变化。要清理,你可以做

hg qpop --keep-changes 

弹出修补程序,即使存在本地更改。最后,以去除死,空和应用补丁,你可以使用

hg qrm "Name of patch" 

不能删除应用的补丁,这就是为什么你需要的hg qpop --keep-changes一步。

(注:hg qrmhg qremovehg qdelete别名)。

如果使用TortoiseHg

随着TortoiseHg,出口补丁复制到剪贴板(工作台>右键单击该补丁>导出>复制修补程序),然后不应用修补程序,最后从目标为“工作目录”的剪贴板导入似乎可行。下面是一些屏幕截图展示了这个过程: enter image description here

+3

'--keep-changes'不再是'hg qpop'的有效选项。根据'hg help qpop',似乎'--force'现在可以实现我们想要的功能: “-f --force忘记修补文件的所有本地修改” – sjbx

+0

'hg qrefresh 0' failed with '该系统找不到指定的文件。' 我找到的替代方法(powershell语法):'hg qrefresh --exclude“$(hg root)”'。这告诉MQ排除存储库中的所有内容。无论出于何种原因,只是'.'不起作用,我不得不指定完整路径(因此,'hg root')。 – moswald

+0

@CraftyThumber我仍然看到'--keep-changes',而AFAICT'--force'会失去我们试图保存的更改。 – moswald

6

的可以说是简单的选择:

hg qfinish qtip 
hg strip -k tip 

也就是说,完成补丁,然后删除生成的承诺,同时保留其更改(-k选项strip) 。

相关问题