返回

如何解决patch(1)无法识别带有+++文件名的错误?

Linux

如何让 patch(1) 自动使用带有 +++ 答案的文件

问题

当你尝试使用 patch(1) 应用一个包含大量补丁的文件集时,你可能会遇到以下错误:

无法在输入第 3 行找到要修补的文件
也许你使用了错误的 -p 或 --strip 选项?
导致此问题的文本是:
--------------------------
|--- 源文件    2024-03-09     15:47:51.145613870 +0100
|+++ 目标文件   2024-03-09     16:03:27.723860711 +0100
--------------------------
要修补的文件:

这是因为 patch(1) 无法识别带有 +++ 作为文件名的文件。

解决方法

有几种方法可以解决此问题:

1. 查找原始文件名

首先,我们需要找到与带有 +++ 的文件相对应的原始文件名。我们可以通过查找文件的创建时间和内容来做到这一点:

find . -newer src -type f -printf '%T@ %P\n' | grep '+++\|[0-9]\+\.0[01]' | sort -nk1,1 | cut -d' ' -f2-

2. 使用 -e 选项

找到原始文件名后,我们可以使用 patch(1) 的 -e 选项。该选项允许我们指定用于比较文件的编辑脚本。在这种情况中,编辑脚本将删除 +++ 和文件名之间的所有内容:

patch -Np1 -i <补丁文件> -e 's/^+++ \(.*\)\n\(.*\)/\2\n/'

3. 使用 sed 命令

我们还可以使用 sed 命令删除 +++ 和文件名:

patch -Np1 -i <补丁文件> | sed -e 's/^+++ \(.*\)\n\(.*\)/\2\n/'

4. 其他方法

还有其他一些方法可以解决此问题,例如:

  • 使用 git apply 命令,它可以自动处理带有 +++ 的文件名。
  • 使用 patchutils 工具,它提供了一些选项来处理带有 +++ 的文件名。
  • 手动修改补丁文件,将带有 +++ 的文件名替换为原始文件名。

结论

通过使用 -e 选项或 sed 命令,我们可以让 patch(1) 自动使用带有 +++ 的文件作为要修补的文件。这可以节省大量时间,尤其是当补丁集中有许多文件时。

常见问题解答

  • 为什么 patch(1) 默认情况下不识别带有 +++ 的文件名?
    这是因为 +++ 并不是一个标准的文件名约定。
  • 我可以使用 -t 选项吗?
    不行,-t 选项会完全阻止 patch(1) 应用任何补丁。
  • 我可以在不使用外部工具的情况下解决此问题吗?
    是的,可以使用 sed 命令删除 +++ 和文件名。
  • 我可以使用正则表达式吗?
    是的,可以在 -e 选项中使用正则表达式来匹配和替换 +++ 和文件名。
  • 还有什么其他方法可以解决此问题?
    可以使用 git apply 命令或 patchutils 工具来处理带有 +++ 的文件名。