diff制作补丁和patch打补丁

本文介绍如何利用diff命令制作补丁文件,并详细解释了补丁文件的作用及应用场景。此外,还介绍了如何使用patch命令将补丁应用于源文件,包括具体的命令参数解析及实践操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 制作补丁
制作补丁使用diff命令
假设源文件为/wx/srcdir_bak
目标文件为/tmp/new1/new2/srcdir

目标文件是在源文件基础上的更新,更新之后想产生一个补丁文件。所谓补丁文件,就是记录下这两个文件的

异同。补丁文件作用:升级和备份。

如果源文件是一个linux内核标准源码,可以在内核网站上下载,开发一定到阶段有某一稳定版本之后,我们

想做个备份为V1版本。如果把整个内核目录完全复制一份,那文件太大,非常不方便,这时就可以产生一个

补丁文件作为备份。只需要几K字节,就可以把上百兆的文件备份了。同样,一个上G的文件需要升级,只

需要一个很小的补丁文件就可以了。

下面来产生这个补丁文件,使用命令:
diff -urN /wx/srcdir_bak  /tmp/new1/new2/srcdir > /wx/v1.patch
解析:
diff就是difference的缩写,比较两个文件异同。
-u 两个目录中可能有多个文件,使这些所有的文件的补丁合并到一起
-r 目录中如果有子目录,子目录也要产生补丁
-N 如果其中一个目录有一个文件,而另一个目录下没有,则让这个文件与一个空文件比较,产生补丁
文件顺序:前面是源文件srcdir_bak,后边是目标文件srcdir,两个都是目录文件,两个文件当然也可以同名
使用这个命令之后,在v1.patch中就记录下了源文件如果要变成目标文件,需要做哪些改变。

假设从内核网站下到内核版本linux3.1.0源文件,复制一份开发之后为linux3.1.0_new,开发完某一个功能,

做个备份

diff -urN /wx/linux3.1.0 /wx/linux3.1.0_new > /wx/v1.patch
好了,备份做好了,继续开发之后又出了问题,需要还原到v1版本,那好用patch对linux3.1.0打个补丁吧。
patch -d /wx/linux3.1.0  -p1 < /wx/v1.patch

搞定了。如果还需要linux3.1.0源码,那容易,把从内核网站下载的压缩文件解压一份出来就是了。看完下面

的内容,就知道上面这个命令的意思了。

2 打补丁
先看一下v1.pacth文件内容
--- /wx/srcdir_bak/src     
+++ /tmp/new1/new2/srcdir/src
-old
+new
假设根目录下有一个/srcdir文件,srcdir_bak是srcdir的备份。用补丁更新/srcdir的命令:
cd /wx/srcdir 
进入srcdir目录
patch -p3 < /wx/v1.patch
wx/v1.patch是补丁文件
参数就一个-p3

-p<n>是剥离几层路径名称,n=3就是剥离3层路径,这个n要看v1.patch文件,

 ---   /wx/srcdir_bak/src

+++ /tmp/new1/new2/srcdir/src 

大多数情况下这两个路径都是有相同的路径长度,我这里故意弄成不同的长度,那以哪个路径长度为准呢?

经过试验发现,以路径短的为准,那这里就是 /wx/srcdir_bak/src这个路径。即如果patch文件变为

+++ /wx/srcdir_bak/src

--- /tmp/new1/new2/srcdir/src 

还是分析/wx/srcdir_bak/src这个路径。

文件为src,需要剥离的路径是/wx/srcdir_bak/,最前面的/是第一层,wx/是第二层,srcdir_bak/是第三层,

所以n=3

这里有一点要注意:/tmp/new1/new2/srcdir的srcdir文件名和你要更新的文件名是可以不同的,名字你可以

任意更改。比如一个安装文件,你可能把安装路径和文件名都更改了,这是很常见的。

当然也可以使用命令:
patch -d /srcdir -p3 < /wx/v1.patch
-d 是指定工作目录,这样就不需要cd /wx/srcdir 到工作目录下了

想要掌握这两个命令,还是要亲自做个试验,建一个文件夹,新的文件可以很简单,就像我的源文件内容

为old,目标文件内容问new。

试验的时候还有一个重要的技巧,恢复更新的文件为原来的样子:
patch -d /srcdir -R -p3 < /wx/v1.patch
-R reverse 反转,更新之后还可以再恢复到原来的样子
快去体验吧。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值