如果我们现在有一份源码,另外还有一份基于上一版本的patch,
所谓patch即补丁,为了实现某一功能或修改某些bug而生成的。
1>先来看看patch的语法,这里以patch一块的内容为例
diff --git a/minui/minui.h b/minui/minui.h
old mode 100644
new mode 100755
index a73eb7b..3ea87f9
--- a/minui/minui.h
+++ b/minui/minui.h
@@ -59,6 +59,8 @@ int gr_measure(const char *s);
void gr_font_size(int *x, int *y);
void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy);
+void gr_BarAndBall(gr_surface source, int sx, int sy, int w, int h, int dx, int dy);// add for RecoveryUI
+
unsigned int gr_get_width(gr_surface surface);
unsigned int gr_get_height(gr_surface surface);
①minui.h表示需要修改的文件,---表示源文件minui.h,+++表示目标文件minui.h
@@是diff的块差异语法,即开始修改的行数,用@@来标记开始和结束
这里的标记是@@-59,6 +59,8@@
②-59即源文件的第59行,-59,6表示原文件59行开始的6行
故+59,8表示目标文件59行开始的8行,
没有+-符号的行表示没有改动的行:
int gr_measure(const char *s);
void gr_font_size(int *x, int *y);
void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy);
③然后+开始加内容了
+void gr_BarAndBall(gr_surface source, int sx, int sy, int w, int h, int dx, int dy);// add for RecoveryUI
+
加一行指定内容和空行
后面两行又是没有改动的内容
语法就是这样,很简单吧
2>下面介绍打patch的方法
①先来看看我的patch是哪里的,
看名字 0001-update-recovery-ui.patch
明显这是bootable/recovery的patch,所以需要先进去目录
$cd bootable/recovery/
②git am
$git am ~/patch
这里的~/patch指我的patch所在的目录,patch放在哪里路径就写什么好了
由于patch显然是用git format-patch来生成的,所以用git的工具应该就可以很好的做好。git-am 就是作这件事情
执行git am ~/patch后,如果所修改的文件都能按照patch所描述的diff添加或修改进入,就会直接修改,否则报错,可以看到这里有众多error
由于目前的patch是上以版本的patch,由于行号变量等不一致,所以打到当前版本很有可能会不成功,这时候就需要我们手动修改patch所要修改的内容
来实现patch的功能
③git apply patch --reject
$git apply ~/patch --reject
这条命令就是指出所有patch不成功的段,并生成rej文件在相应目录下,rej文件其实就是patch不成功的那一小部分
再去看看git status
可以看到刚刚生成的rej文件了呢
所以根据rej文件的内容修改code就好了呢,需要适当修改行数变量什么的,自己掌握就好了
修改好后build通过后,将rej文件删除,将修改过或添加的文件$git add后(如果添加所有改动$git add --all)
$git am --continue代表我们已经修改好了error,注意一定修改正确后再执行--continue,否则将退出am状态
或者退出am恢复原有分支$git am --abort