diff和patch应用于提取差异和打补丁

Posted daemony

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了diff和patch应用于提取差异和打补丁相关的知识,希望对你有一定的参考价值。

对开源或第三方代码进行修改,我们需要将原始代码和修改部分分别上传.此时,需要先将修改的部分使用diff提取出来,记录为patch文件.其他人使用时,下载原始代码和patch文件,通过patch命令恢复为和你修改后同样的代码.

 

比如,将kernel原始代码的目录记为a,修改后的kernel代码目录记为b.提取差异为kernel.patch文件,可使用命令,

diff -arNu a b > kernel.patch

注意,使用-a选项是为了将二进制文件也作为文本文件处理进行对比.

 

在原始代码中,需要打上此补丁时,可以使用命令(先进入原始代码目录a中),

cd a; patch -p1 < ../kernel.patch

 

附上diff命令的说明.

 1 用法:diff [选项]... FILES
 2 Compare FILES line by line.
 3 
 4 Mandatory arguments to long options are mandatory for short options too.
 5       --normal                  output a normal diff (the default)
 6   -q, --brief                   report only when files differ
 7   -s, --report-identical-files  report when two files are the same
 8   -c, -C NUM, --context[=NUM]   output NUM (default 3) lines of copied context
 9   -u, -U NUM, --unified[=NUM]   output NUM (default 3) lines of unified context
10   -e, --ed                      output an ed script
11   -n, --rcs                     output an RCS format diff
12   -y, --side-by-side            output in two columns
13   -W, --width=NUM               output at most NUM (default 130) print columns
14       --left-column             output only the left column of common lines
15       --suppress-common-lines   do not output common lines
16 
17   -p, --show-c-function         show which C function each change is in
18   -F, --show-function-line=RE   show the most recent line matching RE
19       --label LABEL             use LABEL instead of file name
20                                   (can be repeated)
21 
22   -t, --expand-tabs             expand tabs to spaces in output
23   -T, --initial-tab             make tabs line up by prepending a tab
24       --tabsize=NUM             tab stops every NUM (default 8) print columns
25       --suppress-blank-empty    suppress space or tab before empty output lines
26   -l, --paginate                pass output through ‘pr‘ to paginate it
27 
28   -r, --recursive                 recursively compare any subdirectories found
29       --no-dereference            don‘t follow symbolic links
30   -N, --new-file                  treat absent files as empty
31       --unidirectional-new-file   treat absent first files as empty
32       --ignore-file-name-case     ignore case when comparing file names
33       --no-ignore-file-name-case  consider case when comparing file names
34   -x, --exclude=PAT               exclude files that match PAT
35   -X, --exclude-from=FILE         exclude files that match any pattern in FILE
36   -S, --starting-file=FILE        start with FILE when comparing directories
37       --from-file=FILE1           compare FILE1 to all operands;
38                                     FILE1 can be a directory
39       --to-file=FILE2             compare all operands to FILE2;
40                                     FILE2 can be a directory
41 
42   -i, --ignore-case               ignore case differences in file contents
43   -E, --ignore-tab-expansion      ignore changes due to tab expansion
44   -Z, --ignore-trailing-space     ignore white space at line end
45   -b, --ignore-space-change       ignore changes in the amount of white space
46   -w, --ignore-all-space          ignore all white space
47   -B, --ignore-blank-lines        ignore changes where lines are all blank
48   -I, --ignore-matching-lines=RE  ignore changes where all lines match RE
49 
50   -a, --text                      treat all files as text
51       --strip-trailing-cr         strip trailing carriage return on input
52 
53   -D, --ifdef=NAME                output merged file with ‘#ifdef NAME‘ diffs
54       --GTYPE-group-format=GFMT   format GTYPE input groups with GFMT
55       --line-format=LFMT          format all input lines with LFMT
56       --LTYPE-line-format=LFMT    format LTYPE input lines with LFMT
57     These format options provide fine-grained control over the output
58       of diff, generalizing -D/--ifdef.
59     LTYPE is ‘old‘, ‘new‘, or ‘unchanged‘.  GTYPE is LTYPE or ‘changed‘.
60     GFMT (only) may contain:
61       %<  lines from FILE1
62       %>  lines from FILE2
63       %=  lines common to FILE1 and FILE2
64       %[-][WIDTH][.[PREC]]{doxX}LETTER  printf-style spec for LETTER
65         LETTERs are as follows for new group, lower case for old group:
66           F  first line number
67           L  last line number
68           N  number of lines = L-F+1
69           E  F-1
70           M  L+1
71       %(A=B?T:E)  if A equals B then T else E
72     LFMT (only) may contain:
73       %L  contents of line
74       %l  contents of line, excluding any trailing newline
75       %[-][WIDTH][.[PREC]]{doxX}n  printf-style spec for input line number
76     Both GFMT and LFMT may contain:
77       %%  %
78       %c‘C‘  the single character C
79       %c‘OOO‘  the character with octal code OOO
80       C    the character C (other characters represent themselves)
81 
82   -d, --minimal            try hard to find a smaller set of changes
83       --horizon-lines=NUM  keep NUM lines of the common prefix and suffix
84       --speed-large-files  assume large files and many scattered small changes
85 
86       --help               display this help and exit
87   -v, --version            output version information and exit
88 
89 FILES are ‘FILE1 FILE2‘ or ‘DIR1 DIR2‘ or ‘DIR FILE...‘ or ‘FILE... DIR‘.
90 If --from-file or --to-file is given, there are no restrictions on FILE(s).
91 If a FILE is ‘-‘, read standard input.
92 如果输入相同,则退出状态为 0;1 表示输入不同;2 表示有错误产生。
93 
94 Report bugs to: [email protected]gnu.org
95 GNU diffutils home page: <http://www.gnu.org/software/diffutils/>
96 General help using GNU software: <http://www.gnu.org/gethelp/>

 

以上是关于diff和patch应用于提取差异和打补丁的主要内容,如果未能解决你的问题,请参考以下文章

Linux下生成patch和打patch

补丁文件和差异文件之间的区别

diff命令

补丁(patch)文件

工具篇:补丁工具diff 和 patch

patch是啥文件