![Diff 总是无法应用我制作的文件补丁?](https://linux22.com/image/528927/Diff%20%E6%80%BB%E6%98%AF%E6%97%A0%E6%B3%95%E5%BA%94%E7%94%A8%E6%88%91%E5%88%B6%E4%BD%9C%E7%9A%84%E6%96%87%E4%BB%B6%E8%A1%A5%E4%B8%81%EF%BC%9F.png)
我的服务器中有一些文件需要打补丁,因此我选择其中一个文件进行测试:
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
。
和dos2unix
(fromdos
在我的系统中,前者是后者的符号链接)都接受命令行上的文件名并进行转换。您可以使用该-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)?