- patch:通过补丁文件,来对原文件打补丁
- diff: 比较两个文件,然后生成一个补丁文件
1.patch用法
patch -p[剥离层级] <[补丁文件]
2.patch命令示例
cd u-boot-1.1./ //进入原文件目录 patch -p1 <../u-boot-1.1.6_jz2440.patach
//“p” 表示去掉补丁文件里路径的第几部分。"1",表示去掉第1个
//“<” 指补丁文件位置
// “../” 表示返回上一个目录,因为这补丁文件和原文件在同一目录下
为什么需要输入-p1?
如下图所示,可以看到补丁文件里,每个需要改的文件,都有u-boot-1.1.6目录,而我们之前已经cd进入了,所以需要输入-p1,去掉它
3.patch文件内容补充
diff -urN u-boot-1.1./common/cmd_bootm.c u-boot-1.1.6_jz2440/common/cmd_bootm.c //绿色代表原文件名以及文件地址,红色代表打上补丁后的新文件名以及地址
--- u-boot-1.1./common/cmd_bootm.c -- ::01.000000000 +
+++ u-boot-1.1.6_jz2440/common/cmd_bootm.c -- ::38.150155640 +
//--- 对文件里代码删减 +++ 对文件里代码添加
@@ -, +, @@ //-318,5 表示在原文件里第318行内有删减,接下来显示5段。+318,5同样类似
//第318行,第一段
switch (hdr->ih_comp) { //第319行,第二段
case IH_COMP_NONE: //第320行,第三段
- if(ntohl(hdr->ih_load) == addr) { //第321行,删减第四段
+ if(ntohl(hdr->ih_load) == data) { //第322行,增加第五段
4.diff常用参数
- -u: 表示在比较结果中输出上下文中一些相同的行,这有利于人工定位
- -r: 表示递归比较各个子目录下的文件
- -N“:将不存在的文件当作空文件
- -B: 忽略对空行的比较
5.diff命令示例
diff -urN u-boot-2012.04. u-boot-2012.04.01_new > u-boot-2012.04.01_new.patch
//u-boot-2012.04.01:原文件
//u-boot-2012.04.01_new:修改后的新文件
当一个文件有多个补丁需要打,则使用for循环批处理命令
比如,在tmp/目录下打上../patches/目录下的所有补丁文件:
cd tmp/ for file in ../patches/*.patch; do patch -p1 < $file; done