十一、diff和patch打补丁

时间:2023-03-08 22:20:33

diff制作补丁文件的原理:告诉我们怎么修改第一个文件后能得到第二个文件。

diff命令常用选项:

-u 输出统一内容的头部信息(打补丁使用),计算机知道是哪个文件需要修改    -r 递归对比目录中的所有资源(可以对比目录)

-a 所有文件视为文本(包括二进制程序)      -N 无文件视为空文件(空文件怎么变成第二个文件)

patch  -pnum(其中num为数字,指定删除补丁文件中多少层路径前缀)

如原始路径为/u/howard/src/blurfl/blurfl.c

-p0则整个路径不变     -p1则修改路径为u/howard/src/blurfl/blurfl.c     -p4则修改路径为blurfl/blurfl.c

-R(reverse)反向修复    -E修复后如果文件为空,则删除该文件

patch对单文件代码打补丁

[root@proxy ~]# cd demo

[root@proxy demo]# vim test1.sh    //v1版本脚本

#!/bin/bash

echo "hello world"

echo "test"

[root@proxy demo]# vim test2.sh   //v2版本脚本

#!/bin/bash

echo "hello the world"

echo "test file"

[root@proxy demo]# diff -u test1.sh test2.sh > test.patch   //diff生成补丁文件

[root@proxy demo]# yum -y install patch       //安装patch软件包

[root@proxy demo]# patch -p0 < test.patch                    //在代码相同目录下为代码打补丁

patching file test1.sh

[root@proxy demo]# patch -RE < test.patch                     //还原旧版本,反向修复

patch对目录下的所有代码打补丁

[root@proxy ~]# mkdir demo

[root@proxy ~]# cd demo

[root@proxy demo]# mkdir {source1,source2}

[root@proxy demo]# echo "hello world"  > source1/test.sh     //source1目录及文件

[root@proxy demo]# cp /bin/find  source1/

[root@proxy demo]#  tree source1/                        //source1目录下2个文件

|-- find

`-- test.sh

[root@proxy demo]# echo "hello the world"  > source2/test.sh    //source2目录及文件

[root@proxy demo]# echo "test" > source2/tmp.txt

[root@proxy demo]# cp /bin/find  source2/

[root@proxy demo]# echo "1" >> source2/find

[root@proxy demo]#  tree source2/                        //source1目录下3个文件

|-- find

|-- test.sh

`-- tmp.txt

[root@proxy demo]# diff -Nuar source1/ source2/ > source.patch   //生成补丁

[root@proxy demo]# ls

source1  source2  source.patch

[root@proxy demo]# cat source.patch                //对比的文件有路径信息

--- source1/test.sh 2018-02-07 22:51:33.034879417 +0800

+++ source2/test.sh 2018-02-07 22:47:32.531754268 +0800

@@ -1 +1 @@

-hello world

+hello the world

[root@proxy demo]# cd source1

[root@proxy source1]# patch  -p1 < ../source.patch