Files
kernel_Notes/Zim/Utils/diff&patch/3.txt
2012-08-08 15:17:56 +08:00

66 lines
3.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Content-Type: text/x-zim-wiki
Wiki-Format: zim 0.4
Creation-Date: 2011-05-14T17:04:45+08:00
====== 3 ======
Created Saturday 14 May 2011
diff和patch使用指南
(转自http://blog.chinaunix.net/u/24474/showart_217098.html)
diff和patch是一对工具在数学上来说diff是对两个集合的差运算patch是对两个集合的和运算。
diff比较两个文件或文件集合的差异并记录下来生成一个diff文件这也是我们常说的patch文件即补丁文件。
patch能将diff文件运用于 原来的两个集合之一从而得到另一个集合。举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A 或A-C =B。
因此我们只要能得到A, B, C三个文件中的任何两个就能用diff和patch这对工具生成另外一个文件。
这就是diff和patch的妙处。下面分别介绍一下两个工具的用法:
1. diff的用法
diff后面可以接两个文件名或两个目录名。 如果是一个目录名加一个文件名,那么只作用在那么个目录下的同名文件。
如果是两个目录的话,作用于该目录下的所有文件,不递归。如果我们希望递归执行,需要使用-r参数。
命令diff A B > C ,一般A是原始文件B是修改后的文件C称为A的补丁文件。
不加任何参数生成的diff文件格式是一种简单的格式这种格式只标出了不一样的行数和内容。我们需要一种更详细的格式可以标识出不同之处的上下文环境这样更有利于提高patch命令的识别能力。这个时候可以用-c开关。
2. patch的用法
patch用于根据原文件和补丁文件生成目标文件。还是拿上个例子来说
patch A C 就能得到B, 这一步叫做对A打上了B的名字为C的补丁。
之一步之后你的文件A就变成了文件B。如果你打完补丁之后想恢复到A怎么办呢
patch -R B C 就可以重新还原到A了。
所以不用担心会失去A的问题。
其实patch在具体使用的时候是不用指定原文件的因为补丁文件中都已经记载了原文件的路径和名称。patch足够聪明可以认出来。但是有时候会有点小问题。比如一般对两个目录diff的时候可能已经包含了原目录的名字但是我们打补丁的时候会进入到目录中再使用patch,着个时候就需要你告诉 patch命令怎么处理补丁文件中的路径。可以利用-pn开关告诉patch命令忽略的路径分隔符的个数。举例如下
A文件在 DIR_A下修改后的B文件在DIR_B下一般DIR_A和DIR_B在同一级目录。我们为了对整个目录下的所有文件一次性diff,我们一般会到DIR_A和DIR_B的父目录下执行以下命令
diff -rc DIR_A DIR_B > C
这个时候补丁文件C中会记录了原始文件的路径为 DIR_A/A
现在另一个用户得到了A文件和C文件其中A文件所在的目录也是DIR_A。 一般他会比较喜欢在DIR_A目录下面进行patch操作它会执行
patch < C
但是这个时候patch分析C文件中的记录认为原始文件是./DIR_A/A但实际上是./A此时patch会找不到原始文件。为了避免这种情况我们可以使用-p1参数如下
patch -p1 < C
此时patch会忽略掉第1个”/”之前的内容,认为原始文件是 ./A这样就正确了。
使用patch
patch附带有一个很好的帮助其中罗列了很多选项但是99%的时间只要两个选项就能满足我们的需要:
patch -p1 < [patchfile]
patch -R < [patchfile] (used to undo a patch)
-p1选项代表patchfile中 文件名左边目录的层数顶层目录在不同的机器上有所不同。要使用这个选项就要把你的patch放在要被打补丁的目录下然后在这个目录中运行path -p1 < [patchfile]。