diff & patch 命令用法

我们可以用下面的命令建立patch文件:
$diff -c week week.new > week.patch

建立好的week.patch如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
*** week    2010-04-17 18:10:14.000000000 +0900
--- week.new    2010-04-17 18:10:14.000000000 +0900
***************
*** 1,7 ****
   Sunday
! Monkeyday
   Tuesday
   Wednesday
   Thursday
   Saturday
- Sunday
--- 1,7 ----
   Sunday
! Monday
   Tuesday
   Wednesday
   Thursday
+ Friday
   Saturday

或者我们还可以用下面的命令建立更简洁的patch文件:

$diff -u week week.new > week.patch

这次建立好的week.patch是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
--- week    2010-04-17 18:10:14.000000000 +0900
+++ week.new    2010-04-17 18:10:14.000000000 +0900
@@ -1,7 +1,7 @@
  Sunday
-Monkeyday
+Monday
  Tuesday
  Wednesday
  Thursday
+Friday
  Saturday
-Sunday

第一种格式是把整个文件分列上下两部分,分别表示它们的区别。
第二种格式仅把整个文件中不同的地方表示出来,缩小了patch文件的尺寸。
无论是使用-c还是-u选项,它们都会默认记录包括差异在内的至少3行信息。
那是因为:patch需要起码2行信息,才能够在目标文件中准确找出需要打补丁的位置。

接下来就是使用patch了。

$patch < week.patch

执行了这条命令后,week文件就和week.new文件完全一致了。

需要注意的是,patch命令一般不指定文件名。
patch命令参照patch文件中记录的文件名来决定对哪个文件打补丁。
并且,patch会选择文件名较短的那个文件作为操作对象。
所以在进行diff前,必须特意对最新的文件赋予相对更长的文件名。

有时候,制作patch文件时所处的目录和执行patch时所处的目录并不一致。
例如,在一个开发项目中,为了方便管理,patch文件被统一制作在项目的某个目录下。

$pwd
/Users/bear/Program/patch_test
$ls -R
workdir
 
./workdir:
week        week.new
$diff -u workdir/week workdir/week.new > week.patch
$cd workdir

此时,我们在workdir目录下。该目录下有我们需要打补丁的文件week,并且补丁文件week.patch在上一级目录。
我们可以用-p开关来告诉patch,当看到patch文件内的目标文件时,应该从第几级目录开始操作。

patch文件的内容如下:

1
2
3
4
5
--- workdir/week        2010-04-17 20:24:14.000000000 +0900
+++ workdir/week.new    2010-04-17 20:24:14.000000000 +0900
@@ -1,7 +1,7 @@
  Sunday
...

而patch命令应该这样执行:

$patch -p1 < ../week.patch

-p后面的1就是告诉patch,当看到patch文件中的workdir/week时,忽略第一级目录workdir,而将week作为patch操作的目标文件。
当你有多级目录的时候,就可以根据所处目录的层级,任意调整-p后的数字,完成对目标文件的补丁操作了。


patch A C 就能得到B, 这一步叫做对A打上了B的名字为C的补丁。如果你打完补丁之后想恢复到A怎么办呢?patch -R B C 就可以重新还原到A了,所以不用担心会失去A的问题。举例如下,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

但是这个时候patch分析C文件中的记录,认为原始文件是./DIR_A/A,但实际上是./A,此时patch会找不到原始文件。为了避免这种情况我们可以使用-p1参数如下

     patch -p1

此时,patch会忽略掉第1个”/”之前的内容,认为原始文件是 ./A,这样就正确了。

最后有以下几点注意:

1. 一次打多个patch的话,一般这些patch有先后顺序,得按次序打才行。

2. 在patch之前不要对原文件进行任何修改

3. 如果patch中记录的原始文件和你得到的原始文件版本不匹配(很容易出现),那么你可以尝试使用patch, 如果幸运的话,可以成功。大部分情况下,会有不匹配的情况,此时patch会生成rej文件,记录失败的地方,你可以手工修改。


参考文献

http://cookiebear.info/archives/516

http://www.linuxsky.org/doc/admin/200712/213.html

Linux下patch的制作和应用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值