您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页Linux下补丁文件生成、打补丁操作(diff、patch)

Linux下补丁文件生成、打补丁操作(diff、patch)

来源:筏尚旅游网
Linux下补丁⽂件⽣成、打补丁操作(diff、patch)

Linux下的⼀些开源的软件源码包释放时会有⼀个软件包和补丁⽂件,我们根据需求可以选择是否对这个软件包进⾏打补丁。同时,有时为了记录对⼀些⽐较庞⼤的软件⼯程的源码的更改位置时,也会将⾃⼰对源代码的更改的⽣成补丁⽂件。补丁⽂件便于释放给别⼈,也可以记录我们对源码更改的位置,便于我们后期进⾏追溯。因此,学习如何制作补丁⽂件和打补丁操作很有意义。

1、补丁⽣成

补丁⽂件是通过diff命令⽣成的,⽣成补丁⽂件的命令使⽤格式如下:

diff -uNr src modify > patch_file

对于diff命令,它的功能就是逐⾏⽐较两个⽂件的不同,然后输出⽐较的结果。如果将diif输出的⽐较结果保存到某个⽂件中,这个⽂件也就是所谓的diff补丁⽂件命令选项:

-u:选项以统⼀格式创建补丁⽂件,这种格式⽐缺省格式更紧凑些-N:选项确保补丁⽂件将正确地处理已经创建和删除⽂件的情况

-r:递归选项,设置了这个选项,diff会将两个不同版本源代码⽬录中的所有对应⽂件全部都进⾏⼀次⽐较,包括⼦⽬录⽂件FILES:

src:源⽂件(⽬录),未进⾏修改的

modify:基于src,根据需求对⾥⾯的⽂件内容修改之后结果

\">\" 是重定向符号,表⽰将diff⽐较的结果重定向输⼊到patch_file⽂件中(如不指定重定向,diff的结果将打印到标准输出),patch_file⽂件⼀般指定以.patch为后缀。

上述的补丁命令的功能就是逐个⽐较源⽂件(夹)和⽬标⽂件(夹)的所有⽂件,将差异信息记录到patch_file中,patch_file⽂件也就是我们所谓的补丁⽂件。

2、打补丁

有了补丁⽂件那么就可以来进⾏打补丁操作了,打补丁是通过patch命令完成的。⼀般情况下,打补丁命令使⽤格式如下(这⾥只介绍了对源⽂件(夹)进⾏打补丁操作):

patch -pN < xxx.patch

xxx.patch⽂件是上⾯diff命令⽣成的补丁⽂件,打补丁就是patch利⽤diff制作的补丁来实现源⽂件(夹)和⽬的⽂件(夹)的转换。这样说就意味着你可以从源⽂件(夹)到⽬的⽂件(夹),也可以⽬的⽂件(夹)到源⽂件(夹)。⼀般情况下,我们都是将源⽂件打补丁到我们修改后的⽬的⽂件。选项:

-pN:选项打补丁时要忽略掉第N层⽬录

这⾥还是以实例来说明-pN选项的作⽤,假如补丁⽂件内有这样格式内容:

diff -uNr src/bsp/bsp_led.c modify/bsp/bsp_led.c

当我们在src⽬录下进⾏打补丁时,此时打补丁所在的⽬录是在src⽬录,它从当前⽬录下可以寻找bsp的⽂件夹,在它下⾯找bsp_led.c,所以此时需要⽤-p1来指定忽略第⼀个/前的⽬录(这⾥⽤到的是相对路径)。

3、简单测试

创建src⽬录及各⽬录下的⽂件,将src⽬录内容拷贝到modify⽬录,修改modify⽬录⾥的各个源⽂件。⽬录层次信息如下所⽰:

├── modify│ ├── bsp

│ │ ├── bsp_led.c│ │ └── bsp_uart.c│ └── main.c├── src│ ├── bsp

│ │ ├── bsp_led.c│ │ └── bsp_uart.c│ └── main.c

使⽤diff命令⽣成补丁⽂件,补丁⽂件名src_20210416.patch

diff -uNr src/ modify/ > src_20210416.patch

src_20210416.patch补丁⽂件内容格式如下:

diff -uNr src/bsp/bsp_led.c modify/bsp/bsp_led.c ------------------->①

--- src/bsp/bsp_led.c 2021-04-16 09:07:19.638716463 +0800 -------->②+++ modify/bsp/bsp_led.c 2021-04-16 09:48:08.966764603 +0800@@ -1,7 +1,9 @@-------------------->③ #include \"bsp_led.h\"- -------------------------------->④+/*

+ * @brief: led initialization+ */

void bsp_led_init(void) {- + }

① 表⽰下⾯内容是哪个源⽂件和⽬标⽂件的⽐较结果② '---'表⽰的是源⽂件是哪个,'+++'表⽰的是⽬标⽂件是哪个

③ 源⽂件和⽬标⽂件差异位置描述,-1,7表⽰源⽂件的1到7⾏,+1,9表⽰⽬标⽂件的1到9⾏④ -表⽰源⽂件中该位置本来内容,+表⽰将源⽂件中的内容要替换成的内容

使⽤patch命令对src⽂件进⾏打补丁,打补丁完成后,src中的各⽂件内容和modify中各⽂件的内容⼀致了。

patch -p0 < src_20210416.patch

测试⽬录下各⽂件内容

src⽬录: 

int main(int argc, char **argv){

return 0;}

main.c

#include \"bsp_led.h\"

void bsp_led_init(void){}

bsp/bsp_led.c

#include \"bsp_uart.h\"

void bsp_uart_init(void){}

bsp/bsp_uart.c

modify⽬录:

#include \"bsp_uart.h\"#include \"bsp_led.h\"

int main(void){

bsp_led_init(); bsp_uart_init(); while(1) { } return 0;}

main.c

#include \"bsp_led.h\"/*

* @brief: led initialization */

void bsp_led_init(void){}

bsp/bsp_led.c

#include \"bsp_uart.h\"/*

* @brief: uart initialization */

void bsp_uart_init(void){}

bsp/bsp_uart.c

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务