Patch打补丁学习笔记

1.基本命令语法:
  patch [-R] {-p(n)} [--dry-run] < patch_file_name
  p:为path的缩写。
  n:指将patch文件中的path第n条’/’及其左边部分取消
  -R:卸载patch包。
  --dry-run:尝试patch软件,并不真正修改软件。

  例如:

  $ patch -p1 < /home/sense/patch-2.6.19.1      安装补丁
  $ patch -p1 -R < /home/sense/patch-2.6.19.1 卸载补丁

  例如:
  0002-main.patch main.c
  diff --git a/src/core/main.c b/src/core/main.c

  如果这两个文件在同目录下,那么就要省略三层目录(目录路径中有三个"/"),因此打补丁命令为:
  $ patch -p3 < 0002-main.patch

 

2.假如发现某个项目有bug代码,而自己又没有svn的提交权限,那么此时最合适的解决方法就是用diff命令做一个补丁发给项目成员。项目成员通过patch命令可以立刻知道你的意图。

3.实验

  $ diff -Naur old new > foo.patch
  其中-Naur参数属于固定打法,不管是对一个文件,还是对一个目录,在使用这个参数基本就可以了。

  $ patch -p0 < foo.patch (或者进入下层目录,$ patch -p1 < ../foo.patch )

  如果再次使用会提示是否还原,输入y就还原。

 

  如果你想严格指定是应用补丁可以使用下面命令(就是增加N参数):

  # patch -Np0 < foo.patch

  如果你想严格指定是还原补丁可以使用下面命令(就是增加R参数):

  # patch -Rp0 < foo.patch

补充:

补丁:
diff --git a/AMSS/multimedia/display/Hoya/qdidriver/source/coredriver/mdp/mdp_commit.c b/AMSS/multimedia/display/Hoya/qdidriver/source/coredriver/mdp/mdp_commit.c
index 50a097c..3fc4299 100755
--- a/AMSS/multimedia/display/Hoya/qdidriver/source/coredriver/mdp/mdp_commit.c
+++ b/AMSS/multimedia/display/Hoya/qdidriver/source/coredriver/mdp/mdp_commit.c

~/hqx/apps/qnx_ap$ patch -p1 < 0001-Try-to-fix-fake-Vsync-interrupt-happen.diff  //qnx_ap下就是AMSS目录了

另一个:

diff --git a/prebuilt/etc/gfx_be_vmid.cfg b/prebuilt/etc/gfx_be_vmid.cfg
index 70a995b..c141f7b 100755
--- a/prebuilt/etc/gfx_be_vmid.cfg
+++ b/prebuilt/etc/gfx_be_vmid.cfg

~/hqx/apps/qnx_ap$ patch -p1 < ./increase_gsl_hab_server_priority.diff //prebuilt目录就在qnx_ap目录下。又变成需要-p1了,摸不清头脑!这个可以使用git apply打补丁。

 

4.总结

单个文件 

diff –uN from-file to-file > to-file.patch     制作补丁
patch –p0 < to-file.patch                      打补丁
patch –RE –p0 < to-file.patch                  还原

多个文件 

diff –uNr from-docu to-docu >to-docu.patch 
patch –p1 < to-docu.patch 
patch –R –p1

 

二、使用git打补丁

 

1.检测补丁有无问题
$ git apply --check xxx.patch
2. error: xxxxx: patch does not apply
出现这种一般会是补丁冲突,这种一般是强制打上补丁(使用--reject)后根据产生的*.rej文件来手动解决冲突。
3. warning: xxxx.c has type 100644, expected 100755
出现这种警告一般是文件内没有冲突,但是文件的权限发生变动。一般没有影响。
4.强制打补丁
$ git apply --reject xxx.patch
然后再手动修改冲突,find ./ -name *.rej找到这些冲突的补丁,手动打上
5.git am同样有--reject选项,添加这个选项可以将能打上的补丁先打上,冲突的文件生成*.rej文件。

 

打入 patch / diff:
git apply xxx.patch
git apply xxx.diff
检查 patch / diff:
git apply --check xxx.patch
git apply --check xxx.diff
若git和需要打patch的文件不在一个目录:(git在framework下,patch要打入frameworks/base/下)
git apply --check --directory=base/ xxx.patch
git apply --directory=base/ xxx.patch
** git am 后面会说到,以及生产patch和打

 

 

 

补充:

  在Yocto中编译过程中打补丁时,也可以使用这种方法,补丁中的文件路径名是可以改的,不影响补丁的成功打入。

 

补充:

1. 从补丁头信息中获取打补丁的方法

补丁头标识:

//显示如何得到补丁的,注意目录是在linux-4.19-rc3下
diff -urN linux-4.19-rc3/arch/arm/boot/dts/jz2440.dts linux-4.19-rc3_device_tree/arch/arm/boot/dts/jz2440.dts
--- linux-4.19-rc3/arch/arm/boot/dts/jz2440.dts    1970-01-01 08:00:00.000000000 +0800
+++ linux-4.19-rc3_device_tree/arch/arm/boot/dts/jz2440.dts    2018-09-19 11:05:14.705211815 +0800

打补丁的方法:

//注意也要在这个目录下,然后用-p1剥去这个目录
# linux-4.19-rc3# patch -p1 < linux-4.19-rc3_device_tree_for_jz2440.patch

 

2. 对整个目录生成补丁

diff -urN old_dir new_dir > patch

 

 

 

 

 

参考:http://blog.csdn.net/maotianwang/article/details/11107083?reload

http://www.360doc.com/content/13/0323/23/8363527_273525975.shtml

posted on 2017-10-15 21:12  Hello-World3  阅读(24023)  评论(0编辑  收藏  举报

导航