Linux下创建 code diff 和 合并 patch
Linux 下经常需要给别人提供 patch 以及合 patch,这时需要用到 Linux 的 diff 和 patch 命令。
1. diff 命令
diff 命令常用来比较文件、目录,也可以用来制作补丁文件。所谓 “补丁文件” 就是 “修改后的文件” 与 “修改前(原始文件) ” 的差别。
常用选项如下:
1. “-u” : 表示在比较结果中输出上下文中一些相同的行,这有利于人工定位。
2. “-r” :表示递归比较各个子目录下的文件。
3. “-N”:将不存在的文档当做空文件。
4. “-w”:忽略对空格的比较。
5. “-B” :忽略对空行的比较。
EX:假设 linux-2.6.22.6 目录中是原始的内核,linux-2.6.22.6_ok 目录中是修改过的内核,可以使用以下命令制作补丁文件 linux-2.6.22.6_ok.diff (原始目录在前,修改过的目录在后)。
$ diff -urNwB linux-2.6.22.6 linux-2.6.22.6_ok > linux-2.6.22.6_ok.diff
由于 linux-2.6.22.6 是标准的代码,可以从网上自由下载。要发布 linux-2.6.22.6_ok 中所做的修改时,只需要提供补丁文件 linux-2.6.22.6_ok.diff (通常文件很小)。
2. patch 命令
patch 命令被用来打补丁 -- 就是依据补丁文件来修改原始文件。比如对于上面的例子,可以使用以下命令将补丁文件 linux-2.6.22.6_ok.diff 应用到原始目录 linux-2.6.22.6 上去。假设 linux-2.6.22.6_ok.diff 和 linux-2.6.22.6 位于同一目录下。
$ cd linux-2.6.22.6 $ patch -pl < ../linux-2.6.22.6_ok.diff
patch 命令中最重要的选项是 “-pn”:补丁文件中指明了要修改的文件路径,“-pn” 表示忽略路径中第n 个斜线之前的目录。
假设 linux-2.6.22.6_ok.diff 中有如下几行:
diff -urNwB linux-2.6.22.6/A/B/C.h linux-2.6.22.6_ok/A/B/C.h - - - linux-2.6.22.6/A/B/C.h 2007-08-31 02:21:01.00000000 -0400 +++ linux-2.6.22.6_ok/A/B/C.h 2007-09-20 18:11:46.00000000 -0400 ......
使用上述命令打补丁是,patch命令依据 “linux-2.6.22.6/A/B/C.h ”,寻找源文件,“ -p1 ” 表示忽略第1个斜线之前的目录,
所以要修改的源文件是当前目录下的:
A/B/C.h