您可以创建一个不包含要删除的行的数据的"diff"补丁吗?



我想创建一个补丁文件,该文件不包含我要修补的数据的任何源信息。

我正在努力避免这种情况,这样我就可以在不共享原始数据的情况下将补丁重新分发到文件中。

我确实理解这会成为一个单向补丁,但这就是目的。

包括我当前的diff命令

diff -u <(xxd "originalFile") <(xxd "updatedFile") > "originalFile.patch"

有没有一个选项可以让我只保留.patch中的插入

谢谢。

试试这个:

comm -13 <(xxd "originalFile") <(xxd "updatedFile") > "originalFile.patch"

comm -13仅包括更新文件中已更改的行。补丁看起来像这样:

0047b080: 9506 d708 0195 07ed 1209 2400 00a0 410a  ..........$...A.

应用补丁:

xxd -r "originalFile.patch" "originalFile"

如果你只想包括更改后的字节,并且不介意补丁生成速度慢得多(而且补丁可能更大(,你可以这样做:

comm -13 <(xxd -c1 "originalFile") <(xxd -c1 "updatedFile") > "originalFile.patch"

应用补丁:

xxd -c1 -r "originalFile.patch" "originalFile"

xxd -c1将每个字节放在一行上,因此补丁将只包括更改后的字节,而不包括周围的字节。补丁看起来像这样:

0047b087: cf  .
0047b088: 15  .

最后,如果你不想使用comm,这是comm -13:的diff等价物

diff --changed-group-format='%<' --unchanged-group-format=''

例如

diff --changed-group-format='%<' --unchanged-group-format='' <(xxd "originalFile") <(xxd "updatedFile") > "originalFile.patch"

patchdiff的某些版本理解-e来读取/写入ed脚本。

您需要将Index:行添加到标头中,以便补丁能够告知要更改的文件。

请注意,当以这种方式使用时,GNU补丁中似乎有一个错误,这有时会使它将大块应用到错误的文件。当只有d命令出现而没有c时,似乎会发生这种情况。

例如:

$ mkdir old new
$ seq 10 >old/a
$ (seq 3;seq 7 10) >new/a
$ seq 10 >old/b
$ (seq 2 4; seq 6 11) >new/b
$ diff -er old new |
sed s',^diff -er .* new/,----nIndex: new/,' >difs
$ cat difs
----
Index: new/a
4,6d
----
Index: new/b
10a
11
.
5d
1d
$ mkdir test
$ cp old/* test
$ ( cd test; patch -p1 -e <../difs )
?
patch: *** ed FAILED
$
$ (seq 3; echo ok; seq 7 10) >new/a
$ diff -er old new |
sed s',^diff -er .* new/,----nIndex: new/,' >difs2
$ cat difs2
----
Index: new/a
4,6c
ok
.
----
Index: new/b
10a
11
.
5d
1d
$ cp old/* test
$ ( cd test; patch -p1 -e <../difs2 )
$ diff -ur new test
$

最新更新