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

Можно, конечно, изменить функцию демона для установки группы, или можно записать собственное mydaemon функция, чтобы сделать это.

Или самым простым способом просто звонят runuser управляйте этим daemon() использование для запуска программы с деталью UID и GID

22
23.05.2017, 14:33
5 ответов

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

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

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

Однако OP изменил вопрос, чтобы прокомментировать Как преобразования окончания строки работают с ядром git.autocrlf между различными операционными системами и добавил пример, намекающий, что проблема наблюдается с файлами в Windows (в отличие от примера в стиле Unix). Хотя патч пытается устранить несоответствия между окончаниями строк 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

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

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

  • преобразовать все файлы для использования окончаний LF или
  • преобразовать все файлы для использования окончаний CRLF и добавить параметр - binary . .
5
27.01.2020, 19:43

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

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

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

Замечания: я использую патч , версия 2.7.5

5
27.01.2020, 19:43

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

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

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

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

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

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

-1
27.01.2020, 19:43

В моем случае оказалось, что patchбыл вызван из установки Strawberry Perl на этой машине, которая появилась первой в %PATH%(, а патч вообще не был установлен в Cygwin ).

Таким образом, я попытался применить исправление с другим двоичным файлом исправления, а не с тем, с которым оно было создано.

Я установил patchв Cygwin и вызвал явно/usr/bin/patch-сработало.

-1
04.04.2021, 22:10

Я испробовал все решения, но по какой-то причине они не помогли. Вместо этого я сделал обратное, изменив окончания строк в файле, который я пытался исправить, исправив, а затем снова изменив окончания строк в файле, который я исправил.

dos2unix <file I was trying to patch>
patch <any flags you need -- I was just using -p1> < patchfile
unix2dos <file I was trying to patch>

В зависимости от вашей ситуации вам может потребоваться сделать противоположное:

unix2dos <file I was trying to patch>
patch <any flags you need -- I was just using -p1> < patchfile
dos2unix <file I was trying to patch>
-1
23.06.2021, 18:34

Теги

Похожие вопросы