09 diff patch quilt

1. diff

按行比较两个文件的差异
参数:

diff [命令行选项] 原始文件目录 新文件目录

-p  :   在每一个更改处显示c函数
-u  :  按照统一格式输出(默认3行)
-N  :  对于不存在的文件,认为是空白文件或者新增文件
-r  :  递归
-a  :  所有文件都视为文本文件逐行比较

常用 -uparN

eg:

diff -Nuarp a b > different.patch

2. patch

参数

-f  :   强制打入补丁
-pN :   滤过N层前导目录
-E  :  打完补丁后,如果文件内容为空,将其删除
-d  :   表示在指定目录下执行
-R  :  这个选项用于删除补丁
--dry-run   :  试打入,输出打入这个补丁的结果。但不做任何修改

eg:

去掉patch文件中路径的第一个元素

patch -p1 < ../different.patch

3. quilt(不常用)

quilt同意具有生成补丁的应用补丁的功能。相对于diffpatch而言,它还具有管理补丁的功能。quilt的管理结构类似于堆栈,先入后出这样。
还需要注意的是quilt是在源代码中生成一个patches目录,将补丁存在在目录中。所有quilt refresh之后需要update

3.1 基本用法

  • sudo apt-get install quilt
  • quilt top 查询最后一个提交
  • 应用补丁(压栈)
    quilt push -a 应用所有
    quilt push 013-redirect-all-traffic.patc 应用001->013
    quilt push应用单个
  • 取消应用(出栈)
    quilt pop -a 取消所有
    quilt pop 002-helloworld.patch 从栈顶取消到02
    quilt pop取消单个
  • 创建新补丁
    quilt new xxx.patch
  • 添加修改文件(记录文件初始状态)
    quilt add xxx
    当文件被修改完成后,只需要quilt refresh刷新一下,此命令会去保存
  • 查询当前补丁中被修改的文件
    quilt files
  • 查询修改点
    quilt diff

3.2 openwrt中的使用

3.2.1 添加新补丁

  1. make package/example/{clean,prepare} V=s QUILT=1
    对于主机端包make package/example/host/{clean,prepare} V=s QUILT=1解压出补丁
  2. cd build_dir/target-*/example-* 到目的文件
  3. quilt push -a 应用所有补丁(入栈)
  4. quilt new 010-main_code_fix.patch 新建一个补丁
  5. quilt edit src/main.c 将编辑文件与新建文件建立关联
  6. quilt diff 可选
  7. quilt refresh
  8. make package/example/update V=s 将补丁文件移到到buildroot
  9. make package/example/{clean,compile} package/index V=s

3.2.2 修改现有补丁

  1. make package/example/{clean,prepare} V=s QUILT=1
    对于主机端包make package/example/host/{clean,prepare} V=s QUILT=1解压出补丁
  2. cd build_dir/target-*/example-* 到目的文件
  3. quilt series 列出可供修改的补丁
  4. quilt push 010-main_code_fix.patch 修改补丁
  5. quilt edit src/main.c 将编辑文件与补丁文件建立关联
  6. quilt diff 可选
  7. quilt refresh
  8. make package/example/update V=s 将补丁文件移到到buildroot
  9. make package/example/{clean,compile} package/index V=s
posted @ 2022-01-16 16:30  人民广场的二道贩子  阅读(91)  评论(0编辑  收藏  举报