我想创建一个补丁文件,该文件不包含我要修补的数据的任何源信息。
我正在努力避免这种情况,这样我就可以在不共享原始数据的情况下将补丁重新分发到文件中。
我确实理解这会成为一个单向补丁,但这就是目的。
包括我当前的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"
patch
和diff
的某些版本理解-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
$