如何将Mercurial队列修补程序仅转换为本地更改?
显示如何将提交降级到修补程序,但如何仅将mq修补程序转换为本地更改?简短回答 确保已应用修补程序,然后:如何将Mercurial队列修补程序仅转换为本地更改?,mercurial,mercurial-queue,Mercurial,Mercurial Queue,显示如何将提交降级到修补程序,但如何仅将mq修补程序转换为本地更改?简短回答 确保已应用修补程序,然后: hg qrefresh nothing hg qpop --keep-changes hg qdelete "Name of patch" 长答案 首先,您需要确保修补程序不会跟踪任何更改。要做到这一点,请使用 hg qrefresh nothing nothing只是存储库中不存在的随机文件名。为了简洁起见,我通常使用hgqref0hg qrefresh接受可选的文件模式。如果给定,补
hg qrefresh nothing
hg qpop --keep-changes
hg qdelete "Name of patch"
长答案
首先,您需要确保修补程序不会跟踪任何更改。要做到这一点,请使用
hg qrefresh nothing
nothing
只是存储库中不存在的随机文件名。为了简洁起见,我通常使用hgqref0
hg qrefresh
接受可选的文件模式。如果给定,补丁将跟踪与模式匹配的更改,并且只跟踪那些更改。当没有任何内容与文件模式匹配时,修补程序将不会跟踪任何更改,因此只有本地更改
现在你有一个无用的补丁,你有一些地方的变化。要清理,你可以这样做
hg qpop --keep-changes
即使有本地更改,也要弹出修补程序。最后,要删除死的、空的和未应用的补丁,您可以使用
hg qrm "Name of patch"
您无法删除应用的补丁,这就是为什么需要hg qpop--keep changes
步骤的原因
(注意:hg qrm
和hg qremove
是hg qdelete
的别名)
如果使用龟甲
使用TortoiseHg,将补丁导出到剪贴板(工作台>右键单击补丁>导出>复制补丁),然后取消应用补丁,最后从剪贴板导入目标为“工作目录”的补丁似乎可以工作。以下是演示此过程的一些屏幕截图:
一个更简单的选择:
hg qfinish qtip
hg strip -k tip
也就是说,完成修补程序,然后删除结果提交,同时保留其更改(将
-k
选项设置为strip
)。对不起,mq修补程序已经是“仅本地更改”,AFAIK。为什么您想要更多?“本地更改”是Mercurial术语,用于表示不在变更集中或未被Mercurial补丁跟踪的更改。想要将修补程序转换回本地更改可能有几个原因。无论如何,我已经做了好几次了,但在堆栈溢出和谷歌搜索中都没有找到答案(我必须使用RTFM),所以当我找到答案时,我就分享了答案,以防其他人也这么做。--保留更改
不再是hg qpop
的有效选项。根据hg-help-qpop
,似乎--force
现在是实现我们想要的选项:“-f--force忘记对补丁文件的任何本地更改”hg-qrefresh 0
失败,系统无法找到指定的文件。我找到的备选方案(powershell语法):hg-qrefresh--exclude“$(hg root)”
。这告诉MQ排除存储库中的所有内容。不管出于什么原因,只是
不起作用,我必须指定完整的路径(因此,hg root
)。@craftyNumber我仍然看到——保留更改,AFAICT--force
将丢失我们试图保存的更改。我会使用@duplode的选项,因为它更简单,并且不使用--keep changes
或--force
。话虽如此,在我看到我刚刚用Mercurial 2.0.2版成功运行了hg qpop-f
之前,我仍然有我的本地更改,但我首先确认了所有文件的名称都不完全相同,并运行了rsync-av$(hg st-qn)/tmp/
,因此我有一个备份。如果您不确定,一定要备份您的文件!