原文:
由于在u-boot移植过程中,有几处通用文件要更改,假如每次都要自动更改就太麻烦了。制做补丁可以解决这个问题。
学习资料的搜集比较简单,方式一类似于这些中级问题网上资料十分丰富,google或则baidu搜索一下linux常用命令,之后选择有价值的资料,技巧二是阅读man在线文档。完成搜集工作,其实最终要在自己的Linux上作实验,比较总结,消化吸收为自己的东西。要去除如此一种错误思想:一定要学全。要晓得,一次学全是不可能的,只能先学习最为常用的,在之后不断实践的过程中逐渐的丰富,最终达到比较高的水平。掌握的原则是:日有所学,学因而用,用以促学。
首先介绍一下diff和patch。在这儿不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。所以必须学会这几个选项。
1、diff
NAME
diff-finddifferencesbetweentwofiles
SYNOPSIS
diff[options]from-fileto-file
简单的说,diff的功能就是拿来比较两个文件的不同,然杂记录出来,也就是所谓的diff补丁。句型格式:diff【选项】源文件(夹)目的文件(夹),就是要给源文件(夹)打个补丁,使之弄成目的文件(夹),术语也就是“升级”。下边介绍三个最为常用选项:
-r是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。
-N选项确保补丁文件将正确地处理早已创建或删掉文件的情况。
-u选项以统一格式创建补丁文件,这些格式比缺省格式更紧凑些。
2、patch
NAME
patch-applyadifffiletoanoriginal
SYNOPSIS
patch[options][originalfile[patchfile]]
butusuallyjust
patch-pnum
简单的说,patch就是借助diff制做的补丁来实现源文件(夹)和目的文件(夹)的转换。这样说就意味着你可以有源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。下边介绍几个最常用选项:
-p0选项要从当前目录查找目的文件(夹)
-p1选项要忽视掉第一层目录,从当前目录开始查找。
在这儿以实例说明:
---old/modules/pcitableMonSep2711:03:561999
+++new/modules/pcitableTueDec1920:05:412000
假如使用参数-p0,那就表示从当前目录找一个称作old的文件夹,在它下边找寻modules下的pcitable文件来执行patch操作。
假如使用参数-p1,那就表示忽视第一层目录(即不管old)linux patch文件解析,从当前目录找寻modules的文件夹,在它下边找pcitable。这样的前提是当前目录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。其实,可以用相对路径,也可以用绝对路径。不过我通常习惯用相对路径。
-E选项说明假如发觉了空文件,这么就删掉它
-R选项说明在补丁文件中的“新”文件和“旧”文件如今要调换过来了(实际上就是给新版本打补丁linux patch文件解析,让它弄成老版本)
下边结合具体实例来剖析和解决,分为两种类型:为单个文件打补丁和为文件夹内的多个文件打补丁。
环境:在RedHat9.0下边以armlinux用户登录。
目录树如下:
|--bootloader
|--debug
|--images
|--kernel
|--program
|--rootfiles
|--software
|--source
|--sysapps
|--tmp
`--tools
下边在program文件夹下边构建patch文件夹作为实验用,之后步入patch文件夹。
一、为单个文件进行补丁操作
1、建立测试文件test0、test1
[armlinux@lqmpatch]$cat>>test0<
>111111
>111111
>111111
>EOF
[armlinux@lqmpatch]$moretest0
111111
111111
111111
[armlinux@lqmpatch]$cat>>test1<
>222222
>111111
>222222
>111111
>EOF
[armlinux@lqmpatch]$moretest1
222222
111111
222222
111111
2、使用diff创建补丁test1.patch
[armlinux@lqmpatch]$diff-uNtest0test1>test1.patch
【注:由于单个文件,所以不须要-r选项。选项次序没有关系,即可以是-uNlinux重启命令,也可以是-Nu。】
[armlinux@lqmpatch]$ls
test0test1test1.patch
[armlinux@lqmpatch]$moretest1.patch
patch文件的结构
补丁头
补丁头是分别由---/+++开头的两行,拿来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。
一个补丁文件中的多个补丁
一个补丁文件中可能包含以---/+++开头的好多节,每一节拿来打一个补丁。所以在一个补丁文件中可以包含很多个补丁。
块
块是补丁中要更改的地方。它一般由一部份不用更改的东西开始和结束。她们只是拿来表示要更改的位置。她们一般以@@开始,结束于另一个块的开始或则一个新的补丁头。
块的缩进
块会缩进一列,而这一列是拿来表示这一行是要降低还是要删掉的。
块的第一列
+号表示这一行是要加上的。
-号表示这一行是要删掉的。
没有减号也没有负号表示这儿只是引用的而不须要更改。
************************************************************
***diff命令会在补丁文件中记录这两个文件的首次创建时间,如下***
文章评论