linux 打补丁 2原理

1.创建目录 demo

cd demo
有bug文件a.txt:
当前目录为demo

mkdir -p  old/a/p

vi   old/a/p/foo.txt

old_line_1

old_line_2
bug 修复后的foo.txt:
当前目录为demo

mkdir -p  new/a/p

vi   new/a/p/foo.txt

new_line_1

new_line_2
补丁产生:
当前目录为demo
LC_ALL=C TZ=UTC0 diff -Naur old new > foo.patch
补丁内容:
当前目录为demo
[root@monitor demo]# cat foo.patch
diff -Naur old/a/b/foo.txt new/a/b/foo.txt
--- old/a/b/foo.txt -- ::56.999206666 +
+++ new/a/b/foo.txt -- ::03.160497528 +
@@ -, +, @@
-old_line_1
-old_line_2
+new_line_1
+new_line_2
模拟打补丁:(补丁针对 old/a/b.foo.txt文件打补丁)
当前目录demo

[root@monitor demo]# patch -p0 <foo.patch
patching file old/a/b/foo.txt

当前目录demo

[root@monitor demo]# mkdir xx
[root@monitor demo]# cp foo.patch xx
[root@monitor demo]# patch -p0 < xx/foo.patch
 patching file old/a/b/foo.txt

cd xx

当前目录为demo/xx

[root@monitor xx]# patch -p0 < foo.patch

can't find file to patch at input line 4
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff -Naur old/a/b/foo.txt new/a/b/foo.txt
|--- old/a/b/foo.txt 2016-05-26 06:57:56.999206666 +0000
|+++ new/a/b/foo.txt 2016-05-26 06:59:03.160497528 +0000

说明在当前目录不能找到  old/a/b/foo.txt (在demo/xx目录下找到文件与目录去补丁

P0:你当前的目录位置,去找old/a/b/foo.txt

p1:你当前目录位置去找a/b/foo.txt,p1会掉old/,到当前目录找a/b/foo.txt

p2:你当前目录位置去找a/b/foo.txt,p2会掉old/a,到当前目录找b/foo.txt

p3:你当前目录位置去找a/b/foo.txt,p3会掉old/a/b,到当前目录找foo.txt
结论:决定补丁如何补:你的补丁所在的目录(你该把补丁放在那里)
P(N)决定去查找要补丁的文件路径,不同的N,会掉某部分路径后,再在当前目录,找已除掉后路径,找文件去补丁
P(N)与当前目录关系很大,与补丁在那里没有关系 patch -d xx P(N) 〈 XX 可以命令行上指定 工作目录
上一篇:Oracle分组函数cube VS rollup


下一篇:主流nosql数据库对比