天天看点

Linux环境下补丁制作过程

Linux环境下补丁制作过程

最近要做一个补丁文件,学习后做了一个小结。

补丁文件的制作和打补丁主要使用了linux下两条命令行语句:diff和patch,diff用来制作补丁,patch用来打补丁,下面具体介绍他们的用法。

diff

作用:用来比较两个文件的区别;

语法:

$ diff [options] from_file to_file [> patchfile.patch]

详细说明: from_file为源文件,to_file为目标文件,> patchfile_patch用于创建一个名为patchfile.patch的文件,详细记录了两个文件的具体区别,也就是我们需要的补丁文件,当省略这部分则会直接在终端输出。Options为可选参数,下面三个为最常用的三个选项:

  • -r 递归选项,用于将两个目录下所有文件(包括子目录下的子文件)逐一比对,通常用于对多个文件或者文件夹打补丁;
  • -N 确保补丁文件将正确的处理已经创建或者删除的文件的情况;
  • -u 以统一格式(diff有传统格式和统一格式,现在基本都是用统一格式)创建补丁文件,这种格式比传统格式更紧凑些;
  • 此外还有很多选项,可以通过$ diff –help 命令查看,此处就不详细介绍了,制作补丁文件通常上面的三个选项就足够了。

patch

作用:用来为源文件打上补丁;

语法:

$ patch [options] [from_file] [< patchfile.patch]

详细说明: from_file为需要打补丁的文件,< patchfile.patch为补丁文件,通过diff制作得到。Options为可选参数,下面介绍常用选项:

  • -pNum 表示忽略掉第Num层目录。例如:-p0表示从当前目录查找目标文件(夹),-p1表示忽略掉第一层目录,从当前目录查找;
  • -R 反向补丁,即将已经打了补丁的文件还原。

举例说明

为方便起见,文件内容均和文件名相同

1. 两个文件的补丁

a) 在桌面创建两个文件a1.txt和a2.txt,分别添加内容;

b) 制作两个文件的补丁文件:

c) 查看补丁文件内容:

$ cat a12.txt
c1
< a1
\ No newline at end of file
\---
> a2
\ No newline at end of file
a12.patch (END)
           

d) 为a1.txt文件打补丁:

$ patch a1.txt < a12.patch
patching file a1.txt
           

e) 查看现在a1.txt文件内容:

$ cat a1.txt
a2
           

可见补丁制作完成

f) 还原文件内容:

$ patch –R a1.txt < a12.patch
patching file a1.txt
           

g) 查看还原后文件内容:

$ cat a1.txt
a1
           

2. 两个文件夹的补丁

a) 创建如下的实验文件目录树并添加内容:

| -- a -- a1.txt
      |-- a2.txt
      | -- aa -- aa1.txt
            | -- aa2.txt
| -- b -- b1.txt
      |-- b2.txt
      | -- bb -- bb1.txt
            | -- bb2.txt
           

b) 制作补丁文件:

$ diff –Nur a b > ab.patch
           

c) 查看补丁文件内容:

$ cat ab.patch
Binary files a/.DS_Store and b/.DS_Store differ
diff -Nur a/a1.txt b/a1.txt
--- a/a1.txt    2018-03-30 14:23:34.000000000 +0800
+++ b/a1.txt    -- :: +
@@ - +, @@
-a1
\ No newline at end of file
diff -Nur a/a2.txt b/a2.txt
--- a/a2.txt    2018-03-30 14:24:21.000000000 +0800
+++ b/a2.txt    -- :: +
@@ - +, @@
-a2
\ No newline at end of file
diff -Nur a/aa/aa1.txt b/aa/aa1.txt
--- a/aa/aa1.txt    2018-03-30 14:24:17.000000000 +0800
+++ b/aa/aa1.txt    -- :: +
@@ - +, @@
-aa1
\ No newline at end of file
diff -Nur a/aa/aa2.txt b/aa/aa2.txt
--- a/aa/aa2.txt    2018-03-30 14:24:36.000000000 +0800
+++ b/aa/aa2.txt    -- :: +
@@ - +, @@
-aa2
\ No newline at end of file
diff -Nur a/b1.txt b/b1.txt
--- a/b1.txt    1970-01-01 08:00:00.000000000 +0800
+++ b/b1.txt    -- :: +
@@ -, + @@
+b1
\ No newline at end of file
diff -Nur a/b2.txt b/b2.txt
--- a/b2.txt    1970-01-01 08:00:00.000000000 +0800
+++ b/b2.txt    -- :: +
@@ -, + @@
+b2
\ No newline at end of file
Binary files a/bb/.DS_Store and b/bb/.DS_Store differ
diff -Nur a/bb/bb1.txt b/bb/bb1.txt
--- a/bb/bb1.txt    1970-01-01 08:00:00.000000000 +0800
+++ b/bb/bb1.txt    -- :: +
@@ -, + @@
+bb1
\ No newline at end of file
diff -Nur a/bb/bb2.txt b/bb/bb2.txt
--- a/bb/bb2.txt    1970-01-01 08:00:00.000000000 +0800
+++ b/bb/bb2.txt    -- :: +
@@ -, + @@
+bb2
\ No newline at end of file
           

d) 为a文件夹打补丁:

// 首先要进到原文件夹中,这步很重要!
$ cd a
$ patch –p1 < ../ab.patch
patching file a1.txt
patching file a2.txt
patching file aa/aa1.txt
patching file aa/aa2.txt
patching file b1.txt
patching file b2.txt
patching file bb/bb1.txt
patching file bb/bb2.txt
           

e) 还原文件夹内容:

$ patch –R –p1 < ../ab.patch
patching file a1.txt
patching file a2.txt
patching file aa/aa1.txt
patching file aa/aa2.txt
patching file b1.txt
patching file b2.txt
patching file bb/bb1.txt
patching file bb/bb2.txt
           

继续阅读