Patch 解析
前言:
记录一下我在工作中对patch操作积累的相关知识,因为此方面的内容在网络上记录得比较片面与零散,特此记录总结一下以方便学习使用patch。
基本命令介绍:
- 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
- 其他指令
加载所有补丁以及生成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行
-:代表本行文本在升级时应当在新文件中删除
+:代表本行文本在升级时应当在新文件中增加
- 参考资料以及链接
- https://www.cnblogs.com/wuyuxin/p/7001320.html
- quilt.pdf (/usr/share/doc/quilt/quilt.pdf)
- https://linuxacademy.com/blog/linux/introduction-using-diff-and-patch/