补丁因目标文件换行差异匹配失败,如何无需手动修改即可正常应用
解决方案
方法1:直接修改补丁适配多行结构(最稳妥,适合少量补丁场景)
CMake语法中空格和换行完全等价,你只需要把补丁中对应的修改段改成匹配目标文件的两行结构即可,修改后的diff段如下:
--- a/tools/lto/CMakeLists.txt +++ b/tools/lto/CMakeLists.txt @@ -27,8 +27,8 @@ set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/lto.exports) -add_llvm_library(LTO SHARED INSTALL_WITH_TOOLCHAIN ${SOURCES} DEPENDS - intrinsics_gen) +add_llvm_library(LTO INSTALL_WITH_TOOLCHAIN ${SOURCES} DEPENDS + intrinsics_gen) install(FILES ${LLVM_MAIN_INCLUDE_DIR}/llvm-c/lto.h
修改后直接应用补丁即可,无需修改目标文件。
方法2:使用git apply的宽松空白匹配(适合git仓库场景)
Git的补丁应用逻辑比GNU patch的空白处理更灵活,支持跨空白(包括换行)的模糊匹配,执行以下命令即可:
git apply --ignore-whitespace --unidiff-zero 补丁文件路径
如果不需要保留补丁的提交信息,也可以加--reject参数自动处理可匹配的部分,生成拒绝文件手动处理不匹配的少量内容。
方法3:批量预处理目标文件(适合大量文件打同类补丁场景)
针对CMake这类允许命令随意换行的配置文件,可以写单行脚本先合并拆分的命令行,再应用补丁:
# 合并以DEPENDS结尾的add_llvm_library行与下一行,批量处理可以替换目标文件路径为find遍历结果 awk '/add_llvm_library.*DEPENDS$/{getline n; gsub(/^[[:space:]]+/," ",n); print $0 n; next}1' tools/lto/CMakeLists.txt > tmp && mv tmp tools/lto/CMakeLists.txt # 之后正常应用补丁即可 patch -p1 < 补丁文件路径
方法4:使用GNU patch的高宽松度参数
你之前尝试的--ignore-whitespace仅处理行内空白差异,不会匹配换行拆分,改用-l(小写L,等价于--ignore-white-space)参数可以将所有空白序列(包括换行、缩进、空格)视为等价,执行:
patch -l -p1 < 补丁文件路径
内容的提问来源于stack exchange,提问作者HXSP1947
相关产品推荐
相关产品推荐

