Linux & Android生成和应用Patch文件

若我们发现项目有bug,而自己没有代码提交权限,此时最合适的解决方法就是用diff命令做一个补丁分发给项目成员。项目成员通过patch命令可了解你的意图。

 

Patch 过程:

(1) 用diff工具比较新旧代码,生成patch文件(diff功能就是用来比较两个文件不同,然后记录下来);

(2) 使用patch命令,将patch文件合并到原有代码;

(3) 检查是否存在无法patch的文件,修改或重新选择是否对其做patch。patch打完就可以直接编译了。通常在makefile中加入patch命令,然后编译代码。

 

补丁头分别用—/+++来表示要打补丁的文件。 — 开头表示旧文件, +++ 开头表示新文件。

一个补丁文件可能包含以 —/+++ 开头的很多节,每一节用来打一个补丁。所以一个补丁文件中可包含好多个补丁。

是补丁中要修改的地方,他们通常以@@开始,用来表示要修改的位置。结束于另一个块的开始或者一个新的补丁头。块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。块的第一列:

+号表示这一行是要加上的。

-号表示这一行是要删除的。

没有加号也没有减号表示这里只是引用的而不需要修改。

 

打补丁

1、为单个文件生成补丁

diff -up linux-4.9/net/sunrpc/svc.orig.c linux-4.9/net/sunrpc/svc.c > patch

参数:

-u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息.

-p 显示代码所在的函数的信息.

  1. 为多个文件生成补丁

diff -uprN linux-4.9.orig/net/sunrpc/ linux-4.9/net/sunrpc/ > patch

这条命令对比了linux-2.6.28.8.orig/net/sunrpc/和linux-2.6.28.8/net/sunrpc/两个目录下的所有源码差异.

参数详解:

-r 递归地对比一个目录和它的所有子目录(即整个目录树).

-N 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分.

 

生成的补丁中, 路径信息包含了你的Linux源码根目录的名称, 但其他人的源码根目录可能是其它名字, 所以, 打补丁时, 要进入你的Linux源码根目录, 并且告诉patch工具, 请忽略补丁中的路径的第一级目录(参数-p1).

$ patch -p1 < patch1

diff命令必须在整个Linux源码的根目录的上一级目录中执行.

 

示例:

给修改过的内核生成patch,然后用生成的patch给未修改过的内核打补丁。

其中,目录linux-4.9为未修改过的内核,目录linux-4.9_1为修改过的内核

1 $ diff -uparN linux-4.9 linux-4.9_1/ > mypatch

2 $ cd linux-4.9

3 $ patch -p1 < mypatch

 

打完补丁后,需要检查一下有没有拒绝执行的文件,即检查.rej文件的存在。使用命令:

$find . -name *.rej

  如果发现,会将其输出到标准输出终端,默认屏幕。当然,你也可以采用重定向,输出到指定文件,比如reject。

$fine . -name *.rej >reject

  然后可以查看reject的内容了。

 

Android补丁的生成和应用:

把某个commit做成补丁:

git format-patch -1 指定commit号 //生成指定commit号的补丁

git format-patch -3 //从当前分支最新提交点往下共生成3个补丁

应用补丁

git apply test.patch

你可能感兴趣的:(Android,Linux)