制作补丁使用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 反转,更新之后还可以再恢复到原来的样子
快去体验吧。