为什么我的补丁以二进制格式出现?

为什么我的补丁以二进制格式出现?

我正在比较两个目录 220 和 sue,如下所示:

diff -r 220 sue > diff.txt

之后目录如下所示:

$ ls -al
total 20
drwxrwx---+ 1 Administrators Domain Users     0 Jun 24 10:44 .
drwxrwx---+ 1 SYSTEM         SYSTEM           0 Jun 24 09:52 ..
drwxrwx---+ 1 Administrators Domain Users     0 Jun 24 09:54 220
-rw-rwxr--+ 1 jempty         Domain Users 15463 Jun 24 10:44 diff.txt
drwxrwx---+ 1 Administrators Domain Users     0 Jun 24 09:55 sue

确认diff.txt是如下文本:

$ file diff.txt
diff.txt: HTML document, ASCII text, with very long lines, with CRLF, LF line terminators

以上主要是为了证明我可以使用 diff 并且发现并没有太多的差异。

然后按照建议创建补丁文件https://docs.moodle.org/dev/How_to_create_a_patch

$ diff -Naur 220 sue > patch.txt

目录中的结果如下:

$ ls -al
total 133836
drwxrwx---+ 1 Administrators Domain Users         0 Jun 24 10:57 .
drwxrwx---+ 1 SYSTEM         SYSTEM               0 Jun 24 09:52 ..
drwxrwx---+ 1 Administrators Domain Users         0 Jun 24 09:54 220
-rw-rwxr--+ 1 jempty         Domain Users     15463 Jun 24 10:44 diff.txt
-rw-rwxr--+ 1 jempty         Domain Users 137024100 Jun 24 10:57 patch.txt
drwxrwx---+ 1 Administrators Domain Users         0 Jun 24 09:55 sue

正如您所见,patch.txt 文件非常庞大,而且它是二进制的:

$ file patch.txt
patch.txt: data

我应该使用命令patch而不是diff

答案1

220您拥有或sue或中的二进制文件(程序、DLL、数据文件等) 。

第一个命令 ( diff -r) 识别出某些文件是二进制文件,如果是这种情况,则diff只会打印一条消息,指出它们不同。例如,如果220和中sue都有一个二进制文件foo.dat,则输出可能如下所示:

Binary files 220/foo.dat and sue/foo.dat differ

第二个命令有-a标志,它告诉diff无条件地将所有文件视为纯文本,因此它将比较并打印220/foo.dat和之间的差异的原始二进制内容sue/foo.dat。由于diff逐行比较,并且二进制文件通常很少有换行符,因此输出中比较和显示的行将相当大,即使对于相对较小的文件也是如此。

diff为了减少输出的大小,请不要使用-a标志:

$ diff -Nur 220 sue > patch.txt

如果您不关心二进制文件之间的差异,您可以过滤输出以排除它们:

$ diff -Nur 220 sue | grep -v '^Binary files.*differ' > patch.txt

回答你的最后一个问题,patch与 是相反的diff,所以你不会patch在这里使用。你使用diff来查找文件之间的差异,并使用将 的输出patch差异应用diff到这些文件。在指 的输出时,这两个术语可以互换使用diff

相关内容