目录
一、概述
二、基本概念
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 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。