在Windows中使用diff / patch,又名"can't find file to patch at input line 4"



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

我看到了这一页,还有这一页。我已经安装了cygwin diff,所以我在这里安装了gnu patch。我创建了两个文件

testmydir1afile.txt
testmydir2afile.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

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

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

  • diff输出使用unix格式,但补丁需要dos格式
  • 补丁中的默认"strip"不是像您期望的那样-p0。

这工作…

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

必须转换为DOS行结尾,并且必须指定-p0。否则默认为-p1。

后来我对CVS有了更多的了解,所以我不再使用patch了。如果希望将特定更改从一个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

最新更新