Linux中patch文件的使用

  在u-boot移植过程中有几处通用文件要修改如果每次都要手动修改就太麻烦了制作补丁可以解决这个问题
  学习资料收集比较简单思路方法类似于这种初级问题网上资料非常丰富google或者baidu搜索然后选择有价值资料思路方法 2是阅读man在线文档完成收集工作当然最终要在自己Linux上作实验比较整理总结消化吸收为自己东西要除去这么思想:定要学全要知道次学全是不可能只能先学习最为常用在以后不断实战过程中逐步丰富最终达到比较高水平把握原则是:日有所学学以致用用以促学
  首先介绍下df和patch在这里不会把man在线文档上所有选项都介绍那样也没有必要在99%时间里我们只会用到几个选项所以必须学会这几个选项
  1、df
  --------------------
  NAME
  df - find dferences between two files
  SYNOPSIS
  df [options] from-file to-file
  --------------------
  简单df功能就是用来比较两个文件区别然后记录下来也就是所谓df补丁语法格式:df 【选项】 源文件(夹) 目文件(夹)就是要给源文件(夹)打个补丁使的变成目文件(夹)术语也就是“升级”下面介绍 3个最为常用选项:
  -r 是个递归选项设置了这个选项df会将两个区别版本源代码目录中所有对应文件全部都进行次比较包括子目录文件
  -N 选项确保补丁文件将正确地处理已经创建或删除文件情况
  -u 选项以统格式创建补丁文件这种格式比缺省格式更紧凑些
  2、patch
  ------------------
  NAME
  patch - apply a df file to an original
  SYNOPSIS
  patch [options] [originalfile [patchfile]]
  but usually just
  patch -pnum <patchfile>
  ------------------
  简单patch就是利用df制作补丁来实现源文件(夹)和目文件(夹)转换这样说就意味着你可以有源文件(夹)――>目文件(夹)也可以目文件(夹)――>源文件(夹)下面介绍几个最常用选项:
  -p0 选项要从当前目录查找目文件(夹)
  -p1 选项要忽略掉第层目录从当前目录开始查找
  ************************************************************
  在这里以例子介绍说明:
  --- old/modules/pcitable       Mon Sep 27 11:03:56 1999
  + /modules/pcitable       Tue Dec 19 20:05:41 2000
  如果使用参数-p0那就表示从当前目录找个叫做old文件夹在它下面寻找modules下pcitable文件来执行patch操作
  如果使用参数-p1那就表示忽略第层目录(即不管old)从当前目录寻找modules文件夹在它下面找pcitable这样前提是当前目录必须为modules所在目录而df补丁文件则可以在任意位置只要指明了df补丁文件路径就可以了当然可以用相对路径也可以用绝对路径不过我般习惯用相对路径
  ************************************************************
  -E  选项介绍说明如果发现了空文件那么就删除它
  -R  选项介绍说明在补丁文件中“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁让它变成老版本)
  下面结合具体例子来分析和解决分为两种类型:为单个文件打补丁和为文件夹内多个文件打补丁
  环境:在RedHat 9.0下面以armlinux用户登陆
  目录树如下:
  |-- bootloader
  |-- debug
  |-- images
  |-- kernel
  |-- program
  |-- rootfiles
  |-- software
  |-- source
  |-- sysapps
  |-- tmp
  `-- tools
  下面在program文件夹下面建立patch文件夹作为实验用然后进入patch文件夹
  、为单个文件进行补丁操作
  1、建立测试文件test0、test1
  [armlinux@lqm patch]$ cat  >>test0<<EOF
  > 111111
  > 111111
  > 111111
  > EOF
  [armlinux@lqm patch]$ more test0
  111111
  111111
  111111
  [armlinux@lqm patch]$ cat >>test1<<EOF
  > 222222
  > 111111
  > 222222
  > 111111
  > EOF
  [armlinux@lqm patch]$ more test1
  222222
  111111
  111111
  2、使用df创建补丁test1.patch
  [armlinux@lqm patch]$ df -uN test0 test1 > test1.patch
  【注:单个文件所以不需要-r选项选项顺序没有关系即可以是-uN也可以是-Nu
  [armlinux@lqm patch]$ ls
  test0  test1  test1.patch
  [armlinux@lqm patch]$ more test1.patch
  ************************************************************
  patch文件结构
  补丁头
  补丁头是分别由---/+开头两行用来表示要打补丁文件---开头表示旧文件+开头表示新文件
  个补丁文件中多个补丁
  个补丁文件中可能包含以---/+开头很多节节用来打个补丁所以在个补丁文件中可以包含好多个补丁
  块
  块是补丁中要修改地方它通常由部分不用修改东西开始和结束他们只是用来表示要修改位置他们通常以@@开始结束于另个块开始或者个新补丁头
  块缩进
  块会缩进而这列是用来表示这行是要增加还是要删除
  块
  +号表示这行是要加上
  -号表示这行是要删除
  没有加号也没有减号表示这里只是引用而不需要修改
  ************************************************************
  ***df命令会在补丁文件中记录这两个文件首次创建时间如下***
  --- test0       2006-08-18 09:12:01.000000000 +0800
  + test1       2006-08-18 09:13:09.000000000 +0800
  @@ -1,3 +1,4 @@
  +222222
  111111
  -111111
  +222222
  111111
  [armlinux@lqm patch]$ patch -p0 < test1.patch
  patching file test0
  [armlinux@lqm patch]$ ls
  font face="Times New Roman">test0  test1  test1.patch
  [armlinux@lqm patch]$ cat test0
  222222
  111111
  222222
  111111
  3、可以去除补丁恢复旧版本
  [armlinux@lqm patch]$ patch -RE -p0 < test1.patch
  patching file test0
  [armlinux@lqm patch]$ ls
  test0  test1  test1.patch
  [armlinux@lqm patch]$ cat test0
  111111
  111111
  111111
   2、为多个文件进行补丁操作
Tags: 

延伸阅读

最新评论

发表评论