最近遇到了很多停更的 github 仓库,作者已明显放弃了维护。当我们需要修改软件包源代码的时候,就麻烦了。如果自己 fork 后发布重新发布新包,维护成本比较高。对于这种情况,更高效的办法是通过打 patch 的方式来修正软件包的代码。
下面介绍一下具体的实现办法:
为单个文件生成补丁
复制源文件,并修改复制后的文件内容,然后运行 diff 命令:
diff -up path/to/source.ext path/to/source.copy.ext > filename.patch
这条命令会产生类似如下的输出, 你将它重定向到一个文件中, 这个文件就是patch.
参数详解:
-u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息
-p 显示代码所在的c函数的信息
为多个文件生成补丁
diff -uprN path/to/source/ path/to/source_copy/ > patch
这条命令对比了 path/to/source/ 和 path/to/source_copy/ 两个目录下的所有源码差异.
参数详解:
-r 递归地对比一个目录和它的所有子目录(即整个目录树).
-N 如果某个文件缺少了, 就当作是空文件来对比。如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件。如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分。
打补丁
我们将所有生成的 patch 文件放到 patches 目录后就可以使用脚本批量打补丁了。
#/bin/bash
# patch all file in patches dir
for i in $(find ./patches -name '*.patch');
do
patch -N -p0 < $i > /dev/null 2>&1 &
done