一、Linux patch 文件生成和应用
生成方式1:patch
#多文件打 patch
diff -uparN file1 file2 > xx.diff
diff -uparN folder1 folder12 > xx.diff
-------------------------------------------------------
diff --help
-u 显示有差异行的前后几行(上下文), 默认是前后各 3 行, 这样, patch 中带有更多的信息
-p <剥离层级>或--strip=<剥离层级> 设置欲剥离几层路径名称。
-a 逐行比较文本文件
-r 递归
-N 将新添加的文件全新打印出来作为新增的部分。如果不使用N,只简单提示缺少文件。
生成方式2:quilt 是一个制作和应用补丁的工具,它适合于管理较多补丁
sudo apt-get install quilt
#分四步生成patch:quilt new xxx.patchquilt add file1 file2 ...修改文件 file1 file2 ...quilt refresh -pab
#########################
quilt --helpquilt new #创建新补丁文件quilt add {files} #关联文件quilt remove files #取消关联文件,是add相反的操作quilt refresh #修改完成后,将修该记录更新至补丁中quilt top #查看最近的一个patchquilt diff #查看对比修改的内容quilt files #查看当前patch关联的文件quilt series #查看左右的patchquilt pop #回退刚才文件的改动
应用 patch
# p数字:表示跳过几级目录,0 标识不去掉为全路径,3 标识去掉第3层路径 ...
patch -p3 < xx.patch
取消补丁 patch
patch -RE -p0 < xx.patch
patch --help# -R --reverse# -E --remove-empty-files
二、Git patch
根据是否含有 commit 信息,Git 提供了两种补丁方案:
不含commit信息: git diff
生成的 .diff
git diff file1 > xxx.patch #单个文件
git diff <r1>..<r2> > xxx.patch #两个commit间的修改的patch# 所有修改文件打成 patch
git diff > xxx.patch# 检查 patch
git apply --stat xxx.patch # 查看patch的情况
git apply --check xxx.patch # 检查patch是否能够打上,如果没有任何输出,则说明无冲突,可以打上# 应用patch
git apply xxx.patch #可能有冲突
git apply --reject xxx.patch #有冲突时,发生冲突的部分会保存为.rej文件,未发生冲突的部分会成功打上patch
vi xx.rej #修改rej文件,解决冲突
含commit信息: git format-patch
生成的 .patch 文件
git format-patch HEAD^ #生成最近的1次commit的patch
git format-patch -1 #生成最近的1次 等同上一条git format-patch HEAD^^ #生成最近的2次commit的patch
git format-patch -2 #生成最近的2次 等同上一条git format-patch HEAD^^^ #生成最近的3次commit的patch
git format-patch -3 #生成最近的3次 等同上一条git format-patch HEAD^^^^ #生成最近的4次commit的patch
git format-patch -4 #生成最近的4次 等同上一条git format-patch <r1>..<r2> #生成两个commit间的修改的patch(生成的patch不包含r1. <r1>和<r2>都是具体的commit号)
git format-patch <r1> #生成某commit以来的修改patch(不包含该commit)git format-patch --root <r1> #生成从根到r1提交的所有patch# 应用patch
git am -3 --signoff xxx.patch # -3 让 Git 更智能地处理冲突;添加-s或者--signoff,添加本机git信息到为signed off by;
git am -3 -i ~/path/*.patch #多个patch;-i 交互模式选项: Apply? [y]es /[n]o /[e]dit /[v]iew patch /[a]ccept all
git am --abort # 废弃上一条am命令已经打了的patch
#有冲突时:
git apply --reject xxx.patch #有冲突时,发生冲突的部分会保存为.rej文件,未发生冲突的部分会成功打上patch
vi file1.rej #修改rej文件,解决冲突
git add file1
git am --resolved # 告知冲突已解决完
参考链接:
Git 补丁 patch 使用方法
https://blog.csdn.net/u013318019/article/details/114860407