5

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

所以我看到了这个页面,还有这个页面。我已经有 cygwin diff,所以我在这里得到了 gnu 补丁。我做了两个文件

\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

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

4

2 回答 2

13

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

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

这有效...

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

您必须转换为 DOS 行尾,并且必须指定 -p0。否则,默认值为 -p1。我希望这对其他人有帮助。

于 2013-03-01T14:06:26.297 回答
0

从那以后我对 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
于 2013-10-18T14:42:15.653 回答