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 -Rp1 < [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 1234567893 1234567894 1234567895 1234567896 123456789
- 7 1234567898 1234567899 12345678910 12345678911
! 121314151617
--- 1,17 ----1 123456789
! 2 changeigfo3 1234567894 1234567895 1234567896 1234567898 1234567899 12345678910 12345678911
! 12 add new info1314
+ addline151617

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

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

***************:大代码块提示符(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 changeigfo3 1234567894 1234567895 1234567896 123456789
-7 1234567898 1234567899 12345678910 12345678911
-12
+12 add new info1314
+addline151617

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

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

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

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

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

  • 参考资料以及链接
  1. linux patch 格式与说明(收录) - 吴雨欣 - 博客园
  2. quilt.pdf (/usr/share/doc/quilt/quilt.pdf)
  3. Introduction to Using Diff and Patch — A Cloud Guru

linux patch解析相关推荐

  1. Linux进程状态解析

    Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有 不同的状态. Linux进程状态:R (TASK_RUNNING),可执行状态. 只有在该 ...

  2. linux ini文件,Shell script - Linux下解析ini配置文件

    导语Linux 有时候需要统计多台主机上面的数据,比如合并N多主机的日志,然后进行下一步的分析.这个时候如果直接把所有主机IP写死到脚本中的话,下次新增一台主机,就需要再去修改脚本,如果涉及到多个脚本 ...

  3. linux下解析域名

    linux下解析域名<?xml version="1.0" encoding="UTF-8"?> vi /etc/resolv.conf names ...

  4. Linux C解析命令行参数代码

    背景 Linux下解析main函数参数,使用getopt,依赖头文件:#include <unistd.h>. 代码如下: static char g_deviceid[32] = {0} ...

  5. Linux全面解析讲解

    Linux全面解析讲解 目录

  6. linux patch使用方法,Linux patch命令

    patch 英 [pætʃ]   美 [pætʃ] n.补丁,补片;眼罩;斑点;小块 vt.修补,拼凑;暂时遮掩一下;修理,平息(吵架等);用美人斑装饰(脸) vi.打补丁 第三人称单数: patch ...

  7. 最全面的 linux 信号量解析

    一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为 0,说明它被占用,测试的线程 ...

  8. Linux合入patch命令,Linux patch命令

    Linux patch命令 Linux patch命令用于修补文件. patch指令让用户利用设置修补文件的方式,修改,更新原始文件.倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行.如果配合 ...

  9. Linux下解析域名命令-dig 命令使用详解

    Linux下解析域名除了使用nslookup之外,开可以使用dig命令来解析域名,dig命令可以得到更多的域名信息.dig 命令主要用来从 DNS 域名服务器查询主机地址信息.dig的全称是 (dom ...

最新文章

  1. ajax为什么会全局刷新,为什么发送ajax请求页面也会刷新呢?
  2. Sybase中字符串替换函数 STR REPLACE
  3. 【收藏】keepalived配置文件解读
  4. MATLAB调用Python自定义函数(类、函数等) Python调用MATLAB
  5. 训练日志 2019.7.24
  6. 以数据库思维理解区块链
  7. 会动的图解 | 既然IP层会分片,为什么TCP层也还要分段?
  8. 2012.02.17
  9. 项目的权限设计的小计
  10. security工作笔记003---SpringSecurity框架启动报错.bcrypt.BCryptPasswordEncoder‘ that could not be found.
  11. 有20万3年不用,怎样理财呢?
  12. 拿来即用的 Python 时间范围判断方法
  13. 在TFS2013上删除项目
  14. HTTP session的原理
  15. [转]ASP.NET Web API系列教程(目录)
  16. JavaScript设计模式入坑 1
  17. 工作篇-错误的代价及反思
  18. vue-awsome-swiper安装和css引入问题
  19. plc通过无线通讯连接服务器,PLC无线通讯
  20. 身份证阅读器二次开发说明

热门文章

  1. 小程序开发.mpvue.项目构建与运行
  2. Makefile文件的简单编写
  3. 制作三星I9088 刷机ROM的实践(五)
  4. 实体门店全链路营销解决方案
  5. 如何使用awsEnum基于提供的凭证枚举AWS云端资源
  6. 2020.08.08【NOIP提高组】模拟:奶牛的图片 总结
  7. 目前最流行的Web 数据接口 API 设计规范:RESTful
  8. P6352 [COCI2007-2008#3] CETIRI
  9. 小程序实现淘票票选场次轮播功能
  10. 项目管理中的问题以及改进方法