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

10

我有一个补丁文件,内容如下:

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个回答

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 的贡献。

这也解决了我的问题,谢谢。的确,似乎补丁工具在处理包含CRLF的文件时存在问题,即使补丁文件和待打补丁的文件都是这种格式。 - Jeroen Peeters
补丁对我来说很好用,只要补丁文件和待打补丁的文件遵循相同的行尾(即CRLF/LF)。 - Naga Kiran

1
你可以尝试使用dos2unix工具对补丁文件进行处理,这将转换行结尾符。

1
已经这样做了。现在它不再显示“(从补丁中剥离尾随的CRs)”了。错误仍然存在。 - Simon
@Stefan dos2unix 可以使补丁正确,但结果没有换行符。例如,在我的情况下,该文件包含:catdogcow - onmyway133
问题不在补丁文件,而是源文件。 - Jeroen Peeters

-1

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

你确定补丁文件是从主干创建的吗?如果是这样,你的副本应该与基于补丁的那个副本完全相同,所以它不应该失败。我唯一能想到的结论是补丁文件有问题;它与你的文件不匹配。

确认你的工作副本中的dir/file.xml确实包含以下内容:

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

从第7行开始。 (我假设您问题中的代码只是编辑后的副本,因为那里应该有7行,而不是4行。)也就是说,文件的内容是否与补丁的内容匹配? 特别注意间距和行结尾。 如果是这样,那么补丁程序失败的原因就没有理由了。


谢谢,Zac。但我知道补丁不是Subversion的一部分。经过一些尝试,我也遇到了这个文件夹的问题。我应该说,dir实际上在我的分支中。尝试使用patch -p[N]返回了一个类似于“文件未找到”的错误。请查看我的编辑。谢谢! - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接