linux patch解析

Patch 解析

前言:

记录一下我在工作中对patch操作积累的相关知识,因为此方面的内容在网络上记录得比较片面与零散,特此记录总结一下以方便学习使用patch。

基本命令介绍:

  1. diff:

Diff命令为系统自带的文件比较命令,可以比较两个文件或文件夹的差异、并将差异信

息按照用户指定的方式输出。

处理单个文件的比较:

diff -uN [old-file] [new-file] > [old-to-new.patch]

文件夹比较:

diff -uNr [old-dir] [new-dir] > [old-to-new.patch]

    2.git diff:

此命令为git工具集中patch生成的工具,可以比较git仓库中两个版本中改动的文件差异信息,且用法较之于diff命令更为简洁。

获取当前工作区与当前分支最后一次提交的差异:

git diff

获取两次提交的差异信息:

git diff [old-commit-hash] [new-commit-hash]

   3.patch:

patch命令为应用patch的命令,可以根据patch文件对源文件进行升级(打补丁)或降级(去补丁)。

应用补丁(升级):

patch -p1 < [patch_name.patch]

撤销补丁的应用(降级):

patch -RE < [patch_name.patch]

    4.quilt:

quilt是一个大批量补丁集的操作工具,加载补丁后会在执行加载命令的目录下生成.pc

目录以用于quilt的操作的记录以及已应用补丁的备份。

若执行quilt相关命令显示“No series file found”,可以通过设置“QUILT_PATCHES”环境变量解决。

debian系linux发行版一般设置为:

export QUILT_PATCHES=debian/patches

应用所有记录在series的补丁:

quilt push -a

应用下一个记录在series且未加载的补丁:

quilt push

应用series中某一个未加载的补丁:

quilt push [name.patch]

取消最后应用的那个补丁:

quilt pop

取消所有的补丁:

quilt pop -a

使用quilt新建某个补丁:

1).初始化新建补丁

quilt new [file_name.patch]

2).添加追踪文件

quilt add [todo_file_a] [todo_file_b] [todo_file_c] ...

3).修改文件

此时可以使用patch指令修改或者手动修改

4).生成修改记录到补丁

quilt refresh

  1. 其他指令

加载所有补丁以及生成dsc文件:

dpkg-source -b ./ 

使changelog的修改生效:

dpkg-source --commit

Patch简单分析:

本示例采用两个文件内容如下:

dest-info-fit-orig.list:

1 123456789
2 123456789
3 123456789
4 123456789
5 123456789
6 123456789
7 123456789
8 123456789
9 123456789
10 123456789
11
12
13
14
15
16
17
18
19
20

  dest-info-fit-new.list:

1 123456789
2 changeigfo
3 123456789
4 123456789
5 123456789
6 123456789
8 123456789
9 123456789
10 123456789
11
12 add new info
13
14
addline
15
16
17
18
19
20

 

  • diff常规格式补丁

由diff 命令不带参数时生成,由以上两个文件生成的patch内容如下:

生成该补丁的命令为:

diff dest-info-fit-orig.list dest-info-fit-new.list

2c2
< 2 123456789
---
> 2 changeigfo
7d6
< 7 123456789
12c11
< 12
---
> 12 add new info
14a14
> addline

 2c2:操作C(change),左侧数字为原始文件中需要被改变的行,右侧数字为修改后补丁中信息所应该存在的行。

符号<:表示原始文件信息

符号---:原始文件信息与待填充信息的分隔符

符号>:新信息提示符

 

7d6:操作D(delet),左侧只能是一个数字,记录原始文件应该删除的行数7,右侧数字6为去除patch时应当在第6行后面插入该删除信息,用于恢复原始文件。

 

14a14:操作A(append),左侧数字14代表在第14行插入信息,右侧数字14代表插入的信息在新文件中的第14行

  • 上下文格式补丁

由diff命令使用C参数生成,具体操作命令如下:

 diff -c  dest-info-fit-orig.list dest-info-fit-new.list

*** dest-info-fit-orig.list	2020-06-23 13:26:36.268788853 +0800
--- dest-info-fit-new.list	2020-06-23 17:34:45.963815387 +0800
***************
*** 1,17 ****
  1 123456789
! 2 123456789
  3 123456789
  4 123456789
  5 123456789
  6 123456789
- 7 123456789
  8 123456789
  9 123456789
  10 123456789
  11
! 12
  13
  14
  15
  16
  17
--- 1,17 ----
  1 123456789
! 2 changeigfo
  3 123456789
  4 123456789
  5 123456789
  6 123456789
  8 123456789
  9 123456789
  10 123456789
  11
! 12 add new info
  13
  14
+ addline
  15
  16
  17

***:原始文件名提示符,后跟原始文件文件名以及最后修改时间

---:升级后文件名提示符,后跟新文件文件名以及最后修改时间

***************:大代码块提示符(15个*)

***1,17****:表示下方信息对应的原始文件的1-17行范围

---1,17----:表示下方信息对应的新版本文件的1-17行范围

!:标记此行有修改

+:标记此行有插入

-:标记此行有删除

  • 统一格式补丁

由diff命令使用u 参数生成,具体操作命令如下:

diff -u  dest-info-fit-orig.list dest-info-fit-new.list

--- dest-info-fit-orig.list	2020-06-23 13:26:36.268788853 +0800
+++ dest-info-fit-new.list	2020-06-23 17:34:45.963815387 +0800
@@ -1,17 +1,17 @@
 1 123456789
-2 123456789
+2 changeigfo
 3 123456789
 4 123456789
 5 123456789
 6 123456789
-7 123456789
 8 123456789
 9 123456789
 10 123456789
 11
-12
+12 add new info
 13
 14
+addline
 15
 16
 17

---:原始文件路径、文件名、最后修改时间

+++:原始文件路径、文件名、最后修改时间

@@ -1,17 +1,17 @@: -1,17代表下面的文本信息对应原始文件的1-17行;+1,17代表下面文本信息对应新文件的1-17行

-:代表本行文本在升级时应当在新文件中删除

+:代表本行文本在升级时应当在新文件中增加

  • 参考资料以及链接
  1. https://www.cnblogs.com/wuyuxin/p/7001320.html
  2. quilt.pdf (/usr/share/doc/quilt/quilt.pdf)
  3. https://linuxacademy.com/blog/linux/introduction-using-diff-and-patch/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章