Diff 总是无法应用我制作的文件补丁?

Diff 总是无法应用我制作的文件补丁?

我的服务器中有一些文件需要打补丁,因此我选择其中一个文件进行测试:

cp /path/file ~/file

所以现在我的根目录中只有相同的文件,因此我可以对 ~/file 上的文件进行所需的任何更改,然后对这两个文件运行 diff 命令:

diff -Nuar /path/file ~/file > my_file.patch

我也尝试过:

diff -u /path/file ~/file > my_file.patch
diff -c /path/file ~/file > my_file.patch
diff /path/file ~/file > my_file.patch

现在,正如您所看到的,除了我刚刚对文件进行的更改之外,文件上没有任何区别,但是它并没有创建一个仅包含代码来修补我对 /path/file 所做更改的 my_file.patch,而是始终创建一个完整文件,其中 /path/file 的所有内容标记为要删除,而 ~/file 的内容标记为要添加。

然后我尝试应用补丁:

patch -p0 < ~/my_file.patch

而且它失败得很惨...它总是打印出一个包含所有内容的拒绝文件,就像文件一样。

我不知道为什么它总是这样做,用几个文件我可以毫无问题地生成补丁,但用系统上我需要的大多数文件,它根本无法工作。

对于可能存在的问题您有什么想法吗?编码、格式?解决方案?

答案1

是否有可能某些文件有 Windows (DOS) 行尾而不是 Unix 换行符?dos2unix在执行 . 之前尝试运行它们diff

dos2unixfromdos在我的系统中,前者是后者的符号链接)都接受命令行上的文件名并进行转换。您可以使用该-b选项让它进行备份。如果您在各个目录中有大量此类文件,您可以使用它find来处理它们。

find /dir/to/start -type f -name "foo*" -exec fromdos -b {} +

然后,当您对一切进展顺利感到满意时:

find /dir/to/start -type f -name "foo*.bak"  -delete

删除备份。

答案2

patch对当前目录和-p选项非常敏感。您确定您尝试从正确的位置应用补丁吗?您是否指定了-p适合您的补丁文件内容的前缀 (via)?

相关内容