Я пытаюсь создать патч с помощью команды
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
sed -i.bak -e 's/\r$//g' something
. Я не думаю, что dos2unix обрабатывает смешанные концы строк так агрессивно, как вы этого хотите.Ответы:
У меня была та же проблема с использованием
patch
команды, которая поставляется с MSYS2 на Windows. В моем случае и исходный файл, и патч имели конец строки CRLF, и преобразование обоих в LF также не работало. То, что сработало, было следующим:patch
преобразует окончания строк в LF для всех исправленных файлов, поэтому необходимо преобразовать их обратно в CRLF.Obs:
patch
я использую версию 2.7.5источник
Обычно вы можете обойти это, используя
-l
опцию :Это стандартная функция (см. Описание патча POSIX ).
Однако OP изменил вопрос, прокомментировав, как преобразования с окончанием строки работают с git core.autocrlf между различными операционными системами , и добавил пример, намекающий на то, что проблема наблюдается с файлами в Windows (в отличие от примера в стиле Unix). В то время как
patch
попытка учесть несоответствия между окончаниями строк CRLF и LF, она имеет тенденцию предполагать, что последний используется. Если файл исправления имеет окончания CRLF, а файлы для исправления - нет, он будет восстановлен, как в журнале этого примера:Проверяя исходный код, в
similar
функции GNUpatch
обрабатывает пробелы как spaceи Tabс некоторой специальной обработкой в зависимости от того, имеют ли строки завершающий LF. ЧР не упоминается. Он обращает на это вниманиеcheck_line_endings
, но использует эту информацию только как часть сообщения, чтобы помочь диагностировать отклонение. Он удаляет конечные CR в pget_line, если не задана--binary
опция.В патче GNU нет опции сказать ему преобразовать патч с LF-окончаниями в CRLF для применения к файлам с окончаниями строк CRLF. Чтобы использовать его надежно для этого случая, выбор
--binary
опцию.источник
У меня была похожая проблема на Cygwin. В моем случае исправление состояло в том, чтобы использовать
-i
флаг вместо чтения со стандартного ввода.Не удалось выполнить следующее с ошибкой окончания строки :
Но удалось следующее:
Я не уверен в причине, но оставляю это здесь в случае, если у кого-то есть та же самая проблема.
источник