四种常用的打Patch方法

  |   0 评论   |   13,579 浏览

背景

对大数据组件有了深入了解之后,难免会需要对源码进行更改,然而,当升级组件版本的时候就会遇到麻烦:如何将更改合并到新版本当中?本文介绍一种方法:打Patch。

Patch介绍

patch文件也叫补丁,就是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。

补丁是通过diff应用程序来创建的。

为了正确地打上一个补丁,你需要知道这个补丁是从哪个基础版本产生出来的以及这个补丁将要把目前的源代码树变化到什么新的版本。这些信息或者会出现在补丁文件的原数据中,或者可能从文件名中推断出来。

Patch文件的例子

image.png

打Patch的方法

Linux的diff和patch命令

使用diff命令生成Patch文件

diff命令介绍

逐行比较两个文本文件,列出其不同之处。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。

用法

diff [OPTION]... FILES > filename.patch

通常diff -Naur是一个固定用法

参数解释

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

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

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

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

  • -b或–ignore-space-change  忽略空格造成的不同。

  • -B或–ignore-blank-lines  忽略空行造成的不同。

  • -c:使用纲要输出格式。

  • -H:利用试探法加速对大文件的搜索。

  • -I:忽略大小写的变化。

  • -n –rcs:输出RCS格式。

举例

我们将/etc/profile复制一份到/etc/profile2,然后删除/etc/profile2中GIT_HOME的配置项

执行

diff -Naur /etc/profile /etc/profile2

image.png

使用patch命令应用补丁

用法

patch [-R] {-p(n)} [--dry-run] < patch_file_name

参数解释

  • p:为path的缩写。

  • n:指将patch文件中的path第n条"/"及其左边部分取消,生成的补丁中, 路径信息包含了你的Linux源码根目录的名称, 但其他人的源码根目录可能是其它名字, 所以, 打补丁时, 要进入你的Linux源码根目录, 并且告诉patch工具, 请忽略补丁中的路径的第一级目录(参数-p1).

  • -R:卸载patch包。

  • --dry-run:尝试patch软件,并不真正修改软件。

举例

[root@nn1 ~]# diff -Naur /etc/profile /etc/profile2 > profile.path
[root@nn1 ~]# patch -p0 < profile.path
patching file /etc/profile

查看/etc/profile,可见GIT_HOME的配置项已被删除

使用git format-patch命令

git log查看commit id

图中红框内就是commit id

image.png

git format-patch <commit id>打patch

image.png

查看一下打出来的patch

image.png

Eclipse方式

生成Patch文件

打开git log

【Team】-【Show in History】,在对应的Commit上右键,即可打开创建Patch对话框

image.png

指定路径

image.png

应用Patch

与此类似

【Team】-【Apply Patch】打开选择Patch对话框

8.png

选择好Patch后,确定即可

image.png

Idea方式

生成Patch文件

项目上右键,打开【Git】-【Show History】

image.png

选中多个Commit,右键

image.png

image.png

应用Patch

【VCS】-【Apply Patch】

image.png

选中Patch后,确认即可

image.png



读后有收获可以支付宝请作者喝咖啡