3

我的问题类似于交互式程序,以选择性地排除差异文件的一部分- 但有些不同......

假设我有以下“原始”文件:

$ cat test-orig.h 
int varA;
int varB;
int varC;
int varD;
int varE;

...并说我已将这些更改放入“新”文件中:

$ cat test-newmodified.h 
int varA;
int varB;
int varC;
// a couple of lines
// of useless comments
int var_extra1;
int var_extra2;
int varD;
int varE;

那么两者之间的差异将是:

$ diff -Naur test-orig.h test-newmodified.h | tee test.patch
--- test-orig.h 2013-07-18 19:21:25.741027138 +0200
+++ test-newmodified.h  2013-07-18 19:21:19.916998200 +0200
@@ -1,5 +1,9 @@
 int varA;
 int varB;
 int varC;
+// a couple of lines
+// of useless comments
+int var_extra1;
+int var_extra2;
 int varD;
 int varE;

那么假设我有一个补丁文件,(有很多大块),我想删除“无用注释行”。从diff生成的补丁文件中删除整个块通常很容易 - 但如果我只想删除一些行,那么差异计数器(在 上方@@ -1,5 +1,9 @@)也必须修改。比如说,如果文件中的注释行被删除,那么差异将是:

$ diff -Naur test-orig.h test-newmodified-nc.h
--- test-orig.h 2013-07-18 19:21:25.741027138 +0200
+++ test-newmodified-nc.h   2013-07-18 19:26:30.898540270 +0200
@@ -1,5 +1,7 @@
 int varA;
 int varB;
 int varC;
+int var_extra1;
+int var_extra2;
 int varD;
 int varE;

...也就是说,带有评论的计数器,@@ -1,5 +1,9 @@- 现在变成了,没有评论,@@ -1,5 +1,7 @@

如果我只是从补丁中删除注释行test.patch(并将该编辑另存为test-edit.patch),并且不更新计数器,那么我会得到:

$ patch -p0 <test-edit.patch
patching file test-orig.h
patch: **** malformed patch at line 10:  

...并且没有应用这样的补丁。那么,如果我只是将中的更改+1,9为,那么它完全适用:+1.7test-edit.patch

$ patch -p0 <test-edit.patch
patching file test-orig.h

...并按test-orig.h预期更改(没有注释行)。

因此,给定一个补丁文件,其中包含与文件相关的所有大块 - 是否有一个(GUI)(文本)编辑器diff知道(至少,统一差异),这样:当来自大块(或整个大块)的行) 被删除,它会自动更新差异计数器 - 这样编辑的补丁文件仍将干净地应用于原始文件?

4

1 回答 1

2

emacs好吧,由于这个答案,我现在知道我至少可以使用它: #9740489 如何干净地编辑差异/补丁文件?有补丁文件编辑器吗?

如果您在 emacs 中打开一个 diff 文件并将编辑器置于“diff”模式,您实际上可以编辑补丁,它会以一种智能的方式更新大块标记

请注意,在我的系统(Ubuntu Lucid)上,sudo apt-get install emacs安装后,将emacs命令最终符号链接到emacs23-x,它在自己的窗口(而不是终端)中运行。所以我可以打电话:

$ emacs test.patch

...并且emacs将自动以“diff”模式启动:

emacs 差异

然后您可以使用鼠标选择行,但不能使用 Del/Backspace 删除它们 - 您必须使用 Ctrl-W 剪切选择(请参阅在 Emacs 中,如何剪切、粘贴和复制文本块? - 知识基地)。从屏幕截图中可以看出,标记会自动更新。此外,不要使用“比较文件”进入“差异”模式M-x diff(请参阅比较文件 - GNU Emacs 手册;在我的机器上,Mx 是 Alt-X) - 然后它将开始询问要执行的“原始”和“新”输入文件路径diff在他们身上,这不是我们想要的(假设补丁文件已经加载)。最后,GUI 菜单有文件/另存为(以及C-x C-w它的快捷方式)——单击 GUI 菜单会弹出通常的文件对话框,在保存时可以重命名已编辑的文件。

不过,想知道是否有替代方案...

于 2013-07-18T18:08:16.507 回答