无法使用嵌套目录应用补丁

时间:2016-02-09 08:19:14

标签: linux patch

我正在尝试创建简单的补丁,但文件位于不同的目录中。

我的目录结构是:

/-|hello_new.c
  |-1/-|
       |-2/-|
            |-3/hello.c

//hello_new.c:
#include <stdio.h>

int main(int argc, char *argv[]) {
        printf("Hello World\n");
}

//hello.c:
#include <stdio.h>

int main()
{
        printf("Hello World\n");
}

我使用以下方法创建补丁:

diff -u 1/2/3/hello.c hello_new.c > hello.patch

我的补丁文件是hello.patch:

--- 1/2/3/hello.c       2016-02-09 13:31:04.904763020 +0530
+++ hello_new.c 2016-02-08 18:35:47.299940190 +0530
@@ -1,6 +1,5 @@
 #include <stdio.h>

-int main()
-{
+int main(int argc, char *argv[]) {
        printf("Hello World\n");
 }

现在我使用以下方法应用补丁:

patch < hello.patch

但我得patching file hello_new.c 检测到反转补丁。

1 个答案:

答案 0 :(得分:1)

您可以使用patch的{​​{3}}来解决此问题:

  

-p 号码
  --strip=
      将文件名条带计数设置为 number 。请参阅-p option

如果补丁文件中的前/后级别不同,请记住patch优先于部分中的级别数(标题的第一行) )。所以你可以做到

patch -p3 < hello.patch

避免此实例的反向补丁问题。

这是GNU补丁,您可以通过添加--dry-run选项来预览结果(以避免对反向补丁消息给出正确响应的麻烦):

$ patch -p3 --dry-run < hello.patch
patching file hello.c
Hunk #1 succeeded at 2 with fuzz 2 (offset 1 line).

测试补丁时,例如,如果它们与完全不匹配(例如制表符/空格转换,回车换行符),我会预览补丁,并可能添加{{1}帮助-l减少拒绝的选项。