在Windows中使用diff / patch,又称“无法找到要在输入行4处修补的文件”

时间:2013-03-01 14:06:26

标签: windows-7 diff cvs patch

我正在使用CVS和win7。我需要将一些更改从主干复制到分支,所以我想我可以使用" diff -ruN"将更改放入文件,然后使用" patch -i"将它们应用于分支机构。

所以我看到了this pagethis page。我已经有了cygwin diff,所以我得到了gnu patch here。我做了两个文件

\test\mydir1\afile.txt
\test\mydir2\afile.txt

有微小的差异。然后我输入

cd test
diff -ruN mydir1 mydir2 >test.patch
patch --dry-run -i test.patch

,结果是

can't find file to patch at input line 4
Perhaps you should have used the -p or --strip option?

所以我试过

patch --dry-run --verbose -p1 -i test.patch

我得到同样的错误。很长一段时间我尝试了很多其他的事情,没有成功。为什么这么难?

2 个答案:

答案 0 :(得分:12)

好的,这是我需要知道的两件事,但没有在任何地方记录

  • diff输出使用unix格式,但patch需要dos格式
  • 补丁中的默认“条带”不是您所期望的-p0。它是-p1。

这有效......

diff -ruN mydir1 mydir2 | unix2dos > test.patch
patch -p0 -i test.patch

您必须转换为DOS行结尾,并且必须指定-p0。否则默认为-p1。我希望这会帮助别人。

答案 1 :(得分:0)

我已经了解了更多关于CVS的知识,所以我不再使用补丁了。如果要将特定更改从一个CVS分支复制到另一个CVS分支,可以使用CVS UPDATE -j -j执行此操作。例如,假设您将HEAD上的file1.cpp从1.45更改为1.46。您可以导航到分支并键入

cvs update -kk -j 1.45 -j 1.46 file1.cpp

它会将指定的更改从HEAD复制到分支。

如果要复制许多文件中的更改,可以使用cvs rtag根据日期(等)创建标记,然后使用更新中的标记,例如

cvs update -kk -j tagBeforeChange -j tagAfterChange