如何在Linux上应用由Windows SVN生成的差异文件?

9
在Windows上,我使用以下方式创建了一个多文件差异:
svn diff > mydiff.diff

然后将其移植到Linux机器上(使用相同版本的相同代码库,没有更改)。我该如何应用它?执行后

 patch -p0 < mydiff.diff

我得到了以下输出:
patching file licstat/test/unittest/test_licstatactioncontainers.cpp
File licstat/test/unittest/test_licstatactioncontainers.cpp is not empty after patch, as expected
patching file licstat/test/unittest/test_licstatactions.cpp
Hunk #1 FAILED at 99.
1 out of 1 hunk FAILED -- saving rejects to file licstat/test/unittest/test_licstatactions.cpp.rej
can't find file to patch at input line 295
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|Index: licstat/test/unittest/test_licenseserverusagemap.cpp
|===================================================================
|--- licstat/test/unittest/test_licenseserverusagemap.cpp       (revision 6767)
|+++ licstat/test/unittest/test_licenseserverusagemap.cpp       (working copy)
--------------------------
File to patch: 

最后一行是等待我执行的提示。

我应该如何创建/应用补丁才能使其正常工作?

(编辑) 现在我看到文件缺失,diff 没有创建它。手工创建文件后,我遇到了如下错误:

patching file licstat/misc/generic/mysql/stored_procedures.sql
Hunk #1 FAILED at 220.
Hunk #2 FAILED at 245.
Hunk #3 FAILED at 622.
Hunk #4 FAILED at 661.
Hunk #5 FAILED at 810.
Hunk #6 FAILED at 822.
Hunk #7 FAILED at 868.
Hunk #8 FAILED at 999.
8 out of 8 hunks FAILED -- saving rejects to file licstat/misc/generic/mysql/stored_procedures.sql.rej
4个回答

8

如果在Linux文件中存在CR+LF换行符,使用“dos2unix”将无法解决问题。

以下命令可处理任何组合的换行符:

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

0

这种类型的错误可能会在您使用Unix系统时,本地文件格式为CRLF而不是LF时发生。

补丁程序试图将svn diff补丁适应Unix文件格式,但当本地文件处于dos模式时会出现问题,这可能会在dos和unix环境之间共享代码库时发生。

对我有效的方法是首先转换所有即将受影响的文件,例如:

grep ^+++ patchfile.patch | awk '{print $2}' | dos2unix

然后应用补丁:

patch -p0 < patchfile.patch

0

我经常在Windows和Mac系统之间打补丁文件,patch似乎可以正确处理换行符,所以我不认为这是问题。看起来你可能已经删除了test_licstatactioncontainers.cpp,第一个警告就是关于它的。第二个警告似乎是在抱怨找不到文件本身。

这可能是文件名大小写问题吗?Windows对文件名大小写不敏感,但Linux不是。在Linux上,文件实际上叫做Test_LicenceServerUsageMap.cpp或者目录LicStat/Test吗?


是的,我用 SVN 删除了该文件,所以应该没问题。 不,所有目录/文件名都是小写。 - ssobczak

0

尝试使用dos2unix命令将补丁文件中的行结束符从DOS转换为Unix。


如果底层文件具有混合的行尾,这将无法工作。 - dshin

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