Как применить diff, созданный Windows SVN на Linux?

В 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

person ssobczak    schedule 02.07.2010    source источник


Ответы (4)


Использование "dos2unix" не поможет, если у вас в файлах Linux есть перевод строки CR + LF.

Эта команда должна работать с любой комбинацией перевода строки:

patch -p0 -l --binary < patch.diff
person Sergey Galin    schedule 04.06.2012

Я довольно регулярно исправляю файлы между системами Windows и Mac, и patch, похоже, правильно обрабатывает символы новой строки, поэтому я не думаю, что это проблема. Похоже, вы удалили test_licstatactioncontainers.cpp, и первое предупреждение об этом. Второй, похоже, жалуется на то, что не нашел сам файл.

Может быть, это проблема с регистром имени файла? Windows нечувствительна к регистру имен файлов, а Linux - нет. Возможно, файл на самом деле называется Test_LicenceServerUsageMap.cpp в Linux? Или каталог LicStat / Test?

person the_mandrill    schedule 02.07.2010
comment
Да, я удалил файл (с помощью svn), так что все должно быть в порядке. Нет, все имена каталогов / файлов в нижнем регистре. - person ssobczak; 02.07.2010

Попробуйте преобразовать окончания строк в файле патча из DOS в Unix с помощью команды dos2unix.

person Richard Fearn    schedule 02.07.2010
comment
Это не работает, если базовый файл имеет смешанные окончания строк. - person dshin; 12.11.2014

Этот тип ошибки может возникать, когда локальный формат файла - CRLF, а не LF, когда вы работаете в системе unix.

patch пытается адаптировать патч svn diff к формату файла unix, но срабатывает, когда локальные файлы находятся в режиме dos, что может произойти, когда вы разделяете базы кода между средами dos и unix.

Что мне подходит, так это сначала преобразовать все файлы, которые могут быть затронуты, например:

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

А затем применить патч:

patch -p0 < patchfile.patch
person John Weldon    schedule 02.07.2010