Как исправить сообщение «Hunk # 1 FAILED at 1 (разные окончания строки)»?

22

Я пытаюсь создать патч с помощью команды

git diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch

когда я применяю патч, он дает мне

$ patch -v
GNU patch 2.7.5

$ /usr/bin/patch -p1 </var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
patching file sourcefile
Hunk #1 FAILED at 1 (different line endings).
Hunk #2 FAILED at 23 (different line endings).
Hunk #3 FAILED at 47 (different line endings).
Hunk #4 FAILED at 65 (different line endings).
Hunk #5 FAILED at 361 (different line endings).
5 out of 5 hunks FAILED -- saving rejects to file sourcefile.rej

Я пытался применить dos2unix как к файлу src, так и к файлу патча, но сообщение не исчезло ...

UPD: --ignore-whitespace тоже не помогает

PATCH COMMAND:  patch -p1 -g0 -E --no-backup-if-mismatch --ignore-whitespace --dry-run -f < '/var/lib/layman/dotnet/dev-dotnet/slntools/files/remove-wix-project-from-sln-file-v2.patch'

=====================================================
checking file Main/SLNTools.sln
Hunk #1 FAILED at 14 (different line endings).
Hunk #2 FAILED at 49 (different line endings).
Hunk #3 FAILED at 69 (different line endings).
Hunk #4 FAILED at 102 (different line endings).
4 out of 4 hunks FAILED

UPD: нашел очень хорошую статью: /programming//a/4425433/1709408

user1709408
источник
Попробуй sed -i.bak -e 's/\r$//g' something. Я не думаю, что dos2unix обрабатывает смешанные концы строк так агрессивно, как вы этого хотите.
Arthur2e5
Откровенное зло; если у вас есть патч с окончаниями строк CF-LF, так же как и с файлами, он сначала удачно уберет CR из вашего патча, а затем подбросит, что окончания строк (которые он только что сломал) не совпадают.
SF.

Ответы:

5

У меня была та же проблема с использованием patchкоманды, которая поставляется с MSYS2 на Windows. В моем случае и исходный файл, и патч имели конец строки CRLF, и преобразование обоих в LF также не работало. То, что сработало, было следующим:

$ dos2unix patch-file.patch
$ patch -p1 < patch-file.patch
$ unix2dos modified-files...

patch преобразует окончания строк в LF для всех исправленных файлов, поэтому необходимо преобразовать их обратно в CRLF.

Obs: patchя использую версию 2.7.5

Фернандо Коста Бертольди
источник
5

Обычно вы можете обойти это, используя -lопцию :

используйте параметр -l или --ignore-whitespace, что позволяет патчу сравнивать пустые символы (то есть пробелы и табуляции) свободно, чтобы любая непустая последовательность пробелов в файле патча соответствовала любой непустой последовательности пробелов во входных файлах

Это стандартная функция (см. Описание патча POSIX ).

Однако OP изменил вопрос, прокомментировав, как преобразования с окончанием строки работают с git core.autocrlf между различными операционными системами , и добавил пример, намекающий на то, что проблема наблюдается с файлами в Windows (в отличие от примера в стиле Unix). В то время как patchпопытка учесть несоответствия между окончаниями строк CRLF и LF, она имеет тенденцию предполагать, что последний используется. Если файл исправления имеет окончания CRLF, а файлы для исправления - нет, он будет восстановлен, как в журнале этого примера:

(Stripping trailing CRs from patch.)
patching file xterm.log.html
(Stripping trailing CRs from patch.)
patching file xterm.man
(Stripping trailing CRs from patch.)
patching file xtermcfg.hin

Проверяя исходный код, в similarфункции GNU patchобрабатывает пробелы как spaceи Tabс некоторой специальной обработкой в ​​зависимости от того, имеют ли строки завершающий LF. ЧР не упоминается. Он обращает на это внимание check_line_endings, но использует эту информацию только как часть сообщения, чтобы помочь диагностировать отклонение. Он удаляет конечные CR в pget_line, если не задана--binary опция.

В патче GNU нет опции сказать ему преобразовать патч с LF-окончаниями в CRLF для применения к файлам с окончаниями строк CRLF. Чтобы использовать его надежно для этого случая, выбор

  • конвертировать все файлы, чтобы использовать окончания LF, или
  • преобразовать все файлы, чтобы использовать окончания CRLF и добавить --binaryопцию.
Томас Дики
источник
5
--ignore-whitespace (без второго тире) тоже не помогает, я обновил вопрос
user1709408
0

У меня была похожая проблема на Cygwin. В моем случае исправление состояло в том, чтобы использовать -iфлаг вместо чтения со стандартного ввода.

Не удалось выполнить следующее с ошибкой окончания строки :

patch -t -N -r - -p0 < patchfile

Но удалось следующее:

patch -t -N -r - -p0 -i patchfile

Я не уверен в причине, но оставляю это здесь в случае, если у кого-то есть та же самая проблема.

Джо
источник