Linux命令:用于应用补丁文件来更新源代码的工具patch详解

目录

一、概述

二、基本概念

1. 补丁文件

2. diff 工具

三、基本用法

1、基本语法

2、常用选项

3、获取帮助

四、patch 工具的主要功能

1. 应用补丁

2. 逆向应用补丁

3. 查看补丁内容

4. 交互模式

5. 非交互模式

6. 备份文件

五、patch基本用法举例

1、应用补丁文件

2、逆向应用补丁文件

3、应用多个补丁文件

4、指定补丁应用目录

5、非交互模式应用补丁

6、生成备份文件

六、 示例

1、应用补丁

(1)查看补丁内容 

(2)应用补丁  

2、生成补丁和应用补丁

(1)生成补丁

(2) 应用补丁

(3)检查和应用

(4)撤销补丁

七、其他


一、概述

        patch 是 Linux 系统中一个非常有用的工具,用于应用补丁文件来更新源代码。补丁文件通常包含了文件差异信息,即源代码文件在不同版本之间的改动。patch 工具可以读取这些差异信息,并将这些改动应用到原始的源代码文件中。

       扩展开来讲,patch将差异文件(通常是由 diff 命令生成的)应用到原始文件上,以更新或修改文件内容。在软件开发中特别有用,比如当需要应用来自上游项目的更新或修复时。

二、基本概念

 patch 工具的基本概念有如下:

1. 补丁文件

   - 补丁文件通常是一个文本文件,包含了文件差异信息,通常是通过 diff 工具生成的。

   - 补丁文件可以包含单个文件或多个文件的差异信息。

2. diff 工具

   - diff 工具用于比较两个文件或目录的不同之处,并生成差异输出。

   - 常见的 diff 输出格式包括 unified diff (-u 选项) 和 context diff (-c 选项),这两种格式都可以被 patch 工具识别。

三、基本用法

1、基本语法

patch 命令的基本语法如下:

        patch [options] <original-file> <patch-file>

  • <original-file> 是想要应用补丁的原始文件。
  • <patch-file> 是包含差异的补丁文件。

2、常用选项

  • -p<num>:去除补丁文件中的路径前缀。<num> 表示要移除的目录层数。例如,如果补丁文件是为 /home/user/project/src/file.c 生成的,但的文件位于 /local/src/file.c,可以使用 -p1 来忽略 /home/user/project/ 这一层目录。
  • -R 或 --reverse:反转补丁的作用,即撤销补丁。
  • - -r:拒绝应用补丁。
  • -i <file>:指定补丁文件。这允许直接在命令行中指定补丁文件,而不是作为 patch 命令的最后一个参数。
  • -d <dir>:在应用补丁之前,先切换到指定的目录。这对于当补丁文件是为不同目录结构中的文件生成时特别有用。
  • -s 或 --silent 或 --quiet:静默模式,不显示补丁过程中的一些信息。
  • -b 或 --backup:在修改文件之前,备份原始文件。备份文件通常会在文件名后加上 .orig 后缀。
  • -N:跳过已应用的补丁。
  • -b:生成备份文件。
  • -V:显示版本信息。
  • -h:显示帮助信息。

3、获取帮助

        命令行中输入指令:

         pathc--h

        出现如下图所示的帮助信息:

四、patch 工具的主要功能

1. 应用补丁

   - patch 可以将补丁文件中的差异信息应用到指定的源代码文件中,从而更新这些文件。

   - 应用补丁时,patch 会逐条检查补丁文件中的差异信息,并将其应用到相应的源代码文件。

2. 逆向应用补丁

   - 使用 -R 选项,可以逆向应用补丁,即将补丁文件中的差异信息撤销,恢复到补丁应用之前的版本状态。

3. 查看补丁内容

   - 使用 -p 选项可以指定补丁文件中的路径信息,帮助 patch 工具正确识别和应用补丁。

   - 使用 -d 选项可以指定补丁应用的目标目录。

4. 交互模式

   - 默认情况下,patch 会在交互模式下运行,询问用户是否继续应用每一条补丁。

   - 使用 -i 选项可以进入交互模式,使用 -r 选项可以拒绝应用补丁。

5. 非交互模式

   - 使用 -s 选项可以使 patch 在非交互模式下运行,自动应用补丁而不询问用户。

   - 使用 -N 选项可以跳过已应用的补丁。

6. 备份文件

   - 使用 -b 选项可以生成备份文件,备份文件通常会带有 ~ 后缀。

五、patch基本用法举例

1、应用补丁文件

patch < patchfile.patch

patch -p1 < patchfile.patch

其中 -p1 指定补丁文件中的路径信息级别为 1 级,即补丁文件中的相对路径信息为一级目录。

2、逆向应用补丁文件

patch -R -p1 < patchfile.patch

3、应用多个补丁文件

patch -p1 < patchfile1.patch && patch -p1 < patchfile2.patch

4、指定补丁应用目录

patch -d /path/to/directory -p1 < patchfile.patch

5、非交互模式应用补丁

patch -s -p1 < patchfile.patch

6、生成备份文件

patch -b -p1 < patchfile.patch

六、 示例

1、应用补丁

    假设有一个补丁文件 example.patch,并且想在当前目录下的 src 目录中应用这个补丁:

(1)查看补丁内容 

   cat example.patch  

(2)应用补丁  

   cd src

   patch -p1 < ../example.patch

  

2、生成补丁和应用补丁

(1)生成补丁

    通常使用diff命令生成补丁文件。例如,比较两个版本的文件并生成补丁:  

   diff -u oldfile.c newfile.c > patchfile

     如下为实际操作结果:

(2) 应用补丁

        使用patch命令将补丁应用到原始文件上:  

   patch -p1 < patchfile  

        -p1选项表示忽略补丁文件中的一层目录前缀。

        实际操作如下:

        操作后的代码如下:

[root@ecs-52a1 real_resource]#
[root@ecs-52a1 real_resource]# patch -p1 < patchfile
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- oldfile.c  2024-09-13 21:16:25.100412727 +0800
|+++ newfile.c  2024-09-13 21:19:02.233639138 +0800
--------------------------
File to patch: oldfile1.c
patching file oldfile1.c
[root@ecs-52a1 real_resource]# ll
total 8
-rw-r--r-- 1 root root 1467 Sep 13 21:24 oldfile1.c
-rw-r--r-- 1 root root  448 Sep 13 21:23 patchfile
[root@ecs-52a1 real_resource]# cat oldfile1.c
int CNetSdkForTclIPC::ZXPtzControl(long LoginID, int channelid, int opt, int param1, TExtPtzInfo *pExtPtzInfo)
{TC_S32 retcode = 0; // 用于存储返回码TC_U32 rspparam = 0; // 用于存储返回参数CM_PTZ_E ptz_cmd = PTZ_CTRL_NONE; // PTZ命令枚举,初始值为无命令bool bstop = false; // 停止标志位,初始值为falseint iparam1 = param1; // 参数1的副本,用于后续计算// 根据opt的值,判断是否执行停止移动等操作if (opt == PTZ_OPT_UP_STOP || opt == PTZ_OPT_DOWN_STOP || opt == PTZ_OPT_LEFT_STOP || opt == PTZ_OPT_RIGHT_STOP ||opt == PTZ_OPT_UL_STOP || opt == PTZ_OPT_DL_STOP || opt == PTZ_OPT_UR_STOP || opt == PTZ_OPT_DR_STOP ||opt == PTZ_OPT_ZOOMIN_STOP || opt == PTZ_OPT_ZOOMOUT_STOP || opt == PTZ_OPT_FOCUSNEAR_STOP || opt == PTZ_OPT_FOCUSFAR_STOP ||opt == PTZ_OPT_IRISOPEN_STOP || opt == PTZ_OPT_IRISCLOSE_STOP){// 设置停止标志位为truebstop = true;}CM_PTZ PtzReq;PtzReq.channel = channelid - 1; // 通道ID减1,可能是由于内部处理需要PtzReq.ptz_cmd = (TC_U32)ptz_cmd; // 将PTZ命令转换为适合传输的数据类型PtzReq.param1 = iparam1; // 设置参数1// 发送PTZ控制命令ret = send_ptz_cmd(&PtzReq);if (ret != 0){printf("发送PTZ控制命令失败, 错误码: %d\n", ret);return -1;}return 0;
}
[root@ecs-52a1 real_resource]#

(3)检查和应用

        有时候,在应用补丁之前,你可能想先预览补丁的内容,可以使用以下命令:  

   patch -p1 --dry-run < patchfile

  

   如果预览结果满意,可以去掉--dry-run选项实际应用补丁。

(4)撤销补丁

        如果你需要撤销已经应用的补丁,可以使用:  

           patch -R -p1 < patchfile

  

七、其他

1、在应用补丁之前,最好备份原始文件,以防万一补丁应用失败或导致问题。

2、确保补丁文件是为正确的文件版本生成的。如果原始文件与补丁文件不兼容(例如,文件已经被其他补丁修改过),patch 命令可能会失败或产生不期望的结果。

3、如果补丁文件是由不同版本的diff命令生成的,可能需要在patch命令中使用不同的选项。

4、在某些情况下,你可能需要手动解决冲突或编辑补丁文件以使其适应你的文件。

patch 工具是一个非常实用的工具,用于应用补丁文件来更新源代码。它可以帮助开发者轻松地将补丁文件中的改动应用到源代码中,简化了版本更新和维护的过程。通过合理的选项设置,patch 工具可以适应不同的应用场景,无论是单个补丁的应用还是批量处理。


 文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划:汉诺塔问题|循环汉诺塔

目录 1. 汉诺塔游戏简介 2.算法原理 3.循环汉诺塔 1. 汉诺塔游戏简介 汉诺塔游戏是一个经典的数学智力游戏&#xff0c;其目标是将塔上不同大小的圆盘全部移动到另一个塔上&#xff0c;且在移动过程中必须遵守以下规则&#xff1a; 每次只能移动一个圆盘较大的圆盘不能放在…

css百分比布局中height:100%不起作用

百分比布局时&#xff0c;我们有时候会遇到给高度 height 设置百分比后无效的情况&#xff0c;而宽度设置百分比却是正常的。 当为一个元素的高度设定为百分比高度时&#xff0c;是相对于父元素的高度来计算的。当没有给父元素设置高度&#xff08;height&#xff09;时或设置…

杂七杂八-系统环境安装

杂七杂八-系统&环境安装 1. 系统安装2. 环境安装 仅个人笔记使用&#xff0c;后续会根据自己遇到问题记录&#xff0c;感谢点赞关注 1. 系统安装 Windows安装linux子系统WSL2&#xff1a;使用windows系统跑linux程序(大模型)WSL VSCode&#xff1a;VSCode连接WSL实现高效…

就服务器而言,ARM架构与X86架构有什么区别?各自的优势在哪里?

一、服务器架构概述 在数字化时代&#xff0c;服务器架构至关重要。服务器是网络核心节点&#xff0c;存储、处理和提供数据与服务&#xff0c;是企业和组织信息化、数字化的关键基础设施。ARM 和 x86 架构为服务器领域两大主要架构&#xff0c;x86 架构服务器在市场占主导&…

学习之git的团队协作

git团队协作 一 团队内协作 生成SSH公钥私钥 一&#xff08;跨团队协作&#xff09;

jmeter之仅一次控制器

仅一次控制器作用&#xff1a; 不管线程组设置多少次循环&#xff0c;它下面的组件都只会执行一次 Tips&#xff1a;很多情况下需要登录才能访问其他接口&#xff0c;比如&#xff1a;商品列表、添加商品到购物车、购物车列表等&#xff0c;在多场景下&#xff0c;登录只需要…

【GBase 8c V5_3.0.0 分布式数据库常用维护命令】

一、查看数据库状态/检查&#xff08;gbase用户&#xff09; 1.gha_ctl monitor 使用gha_ctl monitor查看节点运行情况(跟dcs的地址和端口) gha_ctl monitor -c gbase -l http://172.20.10.8:2379 -Hall |coordinator | datanode | gtm | server|dcs:必选字段。指定查看哪类集…

程序员转行方向推荐

程序员转行方向推荐是一个涉及个人兴趣、技能匹配及市场需求等多方面因素的复杂话题。以下是一些详细的转行方向推荐&#xff0c;旨在帮助程序员在职业生涯中做出更加明智的选择。CSDN大礼包&#xff1a;《2024年最新全套学习资料包》免费分享 技术管理岗位 推荐理由&#xf…

崩坏星穹铁道PC端2.5版本剧情、奖励攻略 用GameViewer远程帮手机减负 随时畅玩星铁PC端

《崩坏&#xff1a;星穹铁道》2.5版本「碧羽飞黄射天狼」在9月10开启&#xff01;上半卡池有五星角色飞霄、知更鸟、卡芙卡、黑天鹅四位角色&#xff0c;还有2.5版本的新剧情&#xff0c;这一次崩铁上线送10连和 1000星琼等其他材料。由于游戏包体过大&#xff0c;不少玩家都选…

光伏开发:工商业光伏的流程管理全面解析

一、项目准备阶段 1、资源寻觅与沟通 首要任务是寻找适合的工商业屋顶或空地资源&#xff0c;并与业主初步交流&#xff0c;了解其意向、屋顶条件及用电情况。这一阶段的关键在于建立信任关系&#xff0c;为后续工作奠定基础。 2、资料收集与核查 全面收集业主资料&#xff…

2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)

引言 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;是连接人类与机器的重要桥梁。随着技术的不断进步&#xff0c;我们见证了从简单的文本分析到复杂的语言理解的转变。ChatGPT&#xff0c;作为自然语言处理领域的一个里程碑&#xff0c;其发展历程不仅…

2_foc闭环调试_ADC电流采样与滤波及pid数据结构

1、ADC电流采样 上次添加了编码器获取电角度的程序&#xff0c;将之前开环控制的角度进行了替换&#xff0c;这次再将电流采样添加进来&#xff0c;之后就可以利用这样一个有反馈的系统进行电流环PI控制器参数调试。 之前写过ADC&#xff0b;DMA电流采样的stm32库函数程序&…

PPT中的图形与图片:插入、调整与格式设置技术详解

目录 引言 一、图形与图片的插入 1. 插入图形 2. 插入图片 二、图形与图片的调整 1. 调整大小与位置 2. 裁剪与旋转 3. 图形与图片的合并与组合 三、图片格式与布局设置 1. 图片格式设置 2. 图片布局设置 示例案例&#xff1a;制作产品展示PPT 四、结论 引言 在现…

浏览器查消息

window.addEventListener(message,function(event){console.log(Received message,event.data)}); 并把弹窗口对准要接收消息的ifrme 发消息的窗口

20240914 每日AI必读资讯

刚刚&#xff0c;OpenAI震撼发布o1大模型&#xff01;强化学习突破LLM推理极限 - OpenAI o1模型需要简单、直接的提示&#xff0c;而非复杂的指导。 - 避免使用思路链提示&#xff0c;因为o1模型已经具备内部推理能力。 - 使用分隔符来明确模型解析的部分&#xff0c;并限制…

网络编程Udp协议

文章目录 UDP协议1、什么是UDP协议&#xff1f;一、定义与基本概念二、主要特点三、报文格式四、应用场景五、总结 2、如何使用Java中的UDP套接字&#xff1f;一、UDP常用APIDatagramSocketDatagramPacket 二、UDP协议下的客户端-服务器服务器客户端 UDP协议 UDP协议&#xff…

微软发布Win11 24H2 九月累计更新补丁KB5043080!

系统之家于9月13日发出最新报道&#xff0c;微软面向Win11 24H2用户推送了九月最新更新补丁KB5043080&#xff0c;系统更新后&#xff0c;版本号将升至26100.1742。本次更新解决了任务管理器不正确显示的情况&#xff0c;还进行了多项改进。接下来&#xff0c;跟随小编一起深入…

小程序的右侧抽屉开关动画手写效果

<template><view><button click"openDrawer">打开抽屉</button><view v-if"showDrawer" class"drawer" :style"{ backgroundColor: bgColor }" click"closeDrawer"><view class"draw…

微信小程序登录与获取手机号 (Python)

文章目录 相关术语登录逻辑登录设计登录代码 相关术语 调用接口[wx.login()]获取登录凭证&#xff08;code&#xff09;。通过凭证进而换取用户登录态信息&#xff0c;包括用户在当前小程序的唯一标识&#xff08;openid&#xff09;、微信开放平台账号下的唯一标识&#xff0…

Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理

Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理 目录 Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理 一、简单介绍 二、FBO 简单介绍 三、案例实现原理 四、注意事项 五、简…