Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mercurial中,如何对特定文件应用反向修补程序?_Mercurial_Rollback - Fatal编程技术网

在mercurial中,如何对特定文件应用反向修补程序?

在mercurial中,如何对特定文件应用反向修补程序?,mercurial,rollback,Mercurial,Rollback,与之相关的是,我正在尝试对单个文件执行回退操作,即使该文件是正在回退的修订的许多参与者之一 HG作为面向变更集的工具,它不想对文件进行操作 我能找到的最接近的方法是使用hg导出创建一个diff,手工编辑diff,然后hg导入以相反的顺序修补文件 …但后来我遇到了一个恼人的情况,声称有一个--reverse选项,可以选择hgpatch,而实际上没有 因此,我能想到的最接近的事情就是生成一个如上所述的手工编辑的补丁,然后使用vanilla patch-R应用一个反向补丁 在这里,hg backout

与之相关的是,我正在尝试对单个文件执行回退操作,即使该文件是正在回退的修订的许多参与者之一

HG作为面向变更集的工具,它不想对文件进行操作

我能找到的最接近的方法是使用hg导出创建一个diff,手工编辑diff,然后hg导入以相反的顺序修补文件

…但后来我遇到了一个恼人的情况,声称有一个--reverse选项,可以选择
hgpatch
,而实际上没有

因此,我能想到的最接近的事情就是生成一个如上所述的手工编辑的补丁,然后使用vanilla patch-R应用一个反向补丁

在这里,
hg backout
命令似乎很有用,但实际上是一种转移注意力的方法


一定有更好的方法,不是吗?

我会这么做:使用一个新的tip版本克隆

hg backout --merge -r revision_where_the_change_happened
将已反转的更改合并到工作副本中

现在将有问题的文件复制到您的常规工作副本并提交

hg commit -m "Reversed the changes to file.h made in revision bla"
扔掉你在上面创建的克隆

这样,mercurial就不知道发生更改的地方的
revision\u与此提交之间有联系。如果你想让mercurial记住这一点,那就做一个

hg revert {all files except the one in question}
在将回退提交合并到工作副本中之后和提交之前。对于第二种方法,您不需要处理克隆,因为您希望保留backout提交


我想,您使用哪种方式取决于特定文件更改的更改集的大小。

您可以使用
-I
(包括与给定模式匹配的名称)参数来完成,只需一行回退:

hg backout --merge -I thefiletorevert -m 'message' OFFENDINGREVISIONID
脚本示例:

hg init testrepo
cd testrepo
echo -e "line1\n\nline3" > file1
echo -e "line1\n\nline3" > file2
hg commit -A -m 'changes to two files'
perl -pi -e 's/line1/line 1/' file1
perl -pi -e 's/line1/line 1/' file2
hg commit -m 'put spaces in line1'
perl -pi -e 's/line3/line 3/' file1
perl -pi -e 's/line3/line 3/' file2
hg commit -m 'put spaces in line3'
hg backout --merge -I file1 -m 'remove spaces from line1' 1
adding file1
adding file2
reverting file1
created new head
changeset 3:6d354f1ad4c5 backs out changeset 1:906bbeaca6a3
merging with changeset 3:6d354f1ad4c5
merging file1
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
file1:line1
file1:line 3
file2:line 1
file2:line 3
样本输出:

hg init testrepo
cd testrepo
echo -e "line1\n\nline3" > file1
echo -e "line1\n\nline3" > file2
hg commit -A -m 'changes to two files'
perl -pi -e 's/line1/line 1/' file1
perl -pi -e 's/line1/line 1/' file2
hg commit -m 'put spaces in line1'
perl -pi -e 's/line3/line 3/' file1
perl -pi -e 's/line3/line 3/' file2
hg commit -m 'put spaces in line3'
hg backout --merge -I file1 -m 'remove spaces from line1' 1
adding file1
adding file2
reverting file1
created new head
changeset 3:6d354f1ad4c5 backs out changeset 1:906bbeaca6a3
merging with changeset 3:6d354f1ad4c5
merging file1
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
file1:line1
file1:line 3
file2:line 1
file2:line 3
结果文件内容:

hg init testrepo
cd testrepo
echo -e "line1\n\nline3" > file1
echo -e "line1\n\nline3" > file2
hg commit -A -m 'changes to two files'
perl -pi -e 's/line1/line 1/' file1
perl -pi -e 's/line1/line 1/' file2
hg commit -m 'put spaces in line1'
perl -pi -e 's/line3/line 3/' file1
perl -pi -e 's/line3/line 3/' file2
hg commit -m 'put spaces in line3'
hg backout --merge -I file1 -m 'remove spaces from line1' 1
adding file1
adding file2
reverting file1
created new head
changeset 3:6d354f1ad4c5 backs out changeset 1:906bbeaca6a3
merging with changeset 3:6d354f1ad4c5
merging file1
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
file1:line1
file1:line 3
file2:line 1
file2:line 3
请注意,file1在中间变更集回退后的第1行中缺少空格,详细日志仅显示在回退中更改的一个文件:

$ hg log -v -r tip
changeset:   3:6d354f1ad4c5
tag:         tip
parent:      1:906bbeaca6a3
user:        Ry4an Brase <ry4an@mini>
date:        Mon Sep 14 12:17:23 2009 -0500
files:       file1
description:
remove spaces from line1
$hg log-v-r提示
变更集:3:6d354f1ad4c5
标签:提示
家长:1:906bbeaca6a3
用户:Ry4an Brase
日期:2009年9月14日星期一12:17:23-0500
文件:file1
说明:
从第1行中删除空格

使用revert命令

hg revert -r1 file
这应将文件内容还原为修订版1中的版本。
然后,您可以进一步编辑它并正常提交。

反向选项是修补,而不是hg修补。我想我理解这个解决方案,但这个案例似乎比我的更简单,因为在这里,您正在备份(中的一个文件)tip更改,而balpha处理的是我备份历史更改的更一般的案例。不,这对于非tip变更集很好,尽管它需要您在最后进行“hg merge”。然而,您最终仍然会得到一个历史图,它准确地反映了发生的事情和变更集的父项,这与balpha的复制不同,它会产生一个线性的changelog.Cool。如果你要发布一个备份隐藏更改的示例,我会将其标记为正确的。你可以将文件重置为早期版本,这是正确的。如果文件在坏版本之后没有更改,它甚至可以在这里工作。但是,如果进行了更多的编辑,那么简单的恢复将不起作用。相反,您必须更新到错误的版本,将文件还原到正确的版本,进行提交并合并两个头部。我相信这基本上就是backout为您所做的。