始终无法在远程Linux计算机上应用SVN修补程序

时间:2010-09-18 11:14:24

标签: linux svn patch

我的典型工作流程如下:

  1. 查看从中继到我的Windows工作机器的代码
  2. 做一些修复(但没有提交SVN)并使用Tortoise SVN的“创建补丁”创建这些修改的补丁。
  3. SSH登录远程Linux服务器,并上传补丁。 linux服务器还检出了主干HEAD。
  4. 在Linux服务器上应用补丁,如:
  5. [work@remoteLinuxBox:~/work] patch -p0 -i ~/work/fix.patch
    (Stripping trailing CRs from patch.)
    patching file src/java/main/myApp/view/action/test/launch/GetPeekAction.java
    Hunk #1 FAILED at 385.
    1 out of 1 hunk FAILED -- saving rejects to file src/java/main/myApp/view/action/test/launch/GetPeekAction.java.rej
    (Stripping trailing CRs from patch.)
    patching file src/java/main/myApp/view/action/test/GetAllCustomerAction.java
    Hunk #1 FAILED at 76.
    1 out of 1 hunk FAILED -- saving rejects to file src/java/main/myApp/view/action/test/GetAllCustomerAction.java.rej
    (Stripping trailing CRs from patch.)
    

    但我总是遇到这样的错误。我认为这是由于Windows和Linux上的行尾不同的原因造成的,因此我使用dos2unix转换了补丁,警告(如从补丁中删除尾随CR)消失了,但补丁仍然失败。

    有一种奇怪的行为,如果文件的修改仅发生在现有行上,则应用补丁将起作用。但是如果添加了新行,则补丁会失败。

    任何人都知道如何解决这个问题?非常感谢

3 个答案:

答案 0 :(得分:4)

使用cygwin svn diff来避免头痛,将确保每个hunk的头部只有LF作为行结束而不是CR + LF。 Linux patch命令不适用于具有CR + LF行结尾的hunk头。 对我来说TortoiseSVN / create patch是破坏的,因为它创建的补丁不是跨平台的。

答案 1 :(得分:3)

我遇到了类似的问题,我认为不仅补丁文件的行分隔符很重要,而且你的工作副本也很重要。

我的工作副本有Windows Line Endings(CR + LF),但在我将受影响的文件(在工作副本中)转换为Unix Line Endings之后,补丁工作了!问题是,现在我的文件比较工具显示工作副本文件与每一行中的存储库不同 - 因为行结尾不同。我想,如果Windows可以处理它们,我最终会将整个存储库转换为Unix行结尾。

希望它有所帮助。

答案 2 :(得分:2)

您可以尝试将“-l --binary”添加到修补命令中,如下所示:

    patch -p0 -l --binary < patch.diff