为什么补丁在SVN工作副本上拒绝我的补丁文件?

时间:2011-01-14 14:47:48

标签: svn patch

我有一个像这样的补丁文件:

Index: dir/file.xml
===================================================================
--- dir/file.xml    (revision 178)
+++ dir/file.xml    (working copy)
@@ -7,7 +7,7 @@
    <markup>
-   <markup />
+   <markup></markup>
    <markup>
    <markup>
@@ -20,6 +20,7 @@
    <markup>
    <markup>
+   <tag>
    <markup>

要将它应用于SVN工作副本,我使用以下方法对其进行分支:

$ svn copy -r 178 trunk/component/dir branches/mybranch

然后我试了

$ cd branches/mybranch
$ ls -R
./dir:
file.xml
$ patch -p0 -i ~/patchfile.patch

但SVN的输出是

(Stripping trailing CRs from patch.)
patching file dir/file.xml
Hunk #1 FAILED at 7.
Hunk #2 FAILED at 20.
2 out of 2 hunks FAILED -- saving rejects to file dir/file.xml.rej

每个文件?

什么可能导致SVN拒绝补丁?我在UNIX机器上,但补丁和存储库有Windows行结束......

感谢您的帮助!

3 个答案:

答案 0 :(得分:8)

dos2unix提示并不差,但没有按照建议解决问题。

我做了什么来实际修补所有文件:

$ cd branches/mybranch
$ sudo apt-get install tofrodos
$ fromdos ~/patchfile.patch
$ fromdos */*
$ patch -p0 -i ~/patchfile.patch
$ todos */*

所以基本上patch似乎在Unix下处理CR/LF行时遇到问题。将其转换为LF,然后在修补后修补并将其转换回来。

对Stefan的信任。

答案 1 :(得分:1)

您可以在补丁文件上尝试dos2unix工具。这将转换行结尾。

答案 2 :(得分:-1)

编辑: 所以我们确定patch不是SVN工具。 SVN对此没有任何直接影响,除非它错误地创建了补丁文件。

你确定补丁文件是从trunk创建的吗?如果是这样,您的副本应该与修补程序所基于的副本相同,因此应该没有理由让它失败。我能想到的唯一结论是补丁文件有问题;它与您的文件不符。

确认工作副本中的dir / file.xml确实包含

  <markup>
  <markup />
  <markup>
  <markup>

从第7行开始。(我假设你的问题中的代码只是一个编辑过的副本,因为那里应该有7行,而不是4.)也就是说,文件的内容是否与内容匹配补丁?特别注意间距和线条末端。如果确实如此,则应该没有理由为什么补丁会失败。