Как использовать патчи, созданные в Windows (с CRLF) в Linux? - PullRequest
10 голосов
/ 16 января 2010

Стандартный патч linux, жестко запрограммированный только для текстовых файлов Unix.

PS: я не хочу конвертировать ВСЕ в unix, а затем конвертировать результат обратно.

Ответы [ 5 ]

14 голосов
/ 18 февраля 2011

Используйте параметр --binary. Вот соответствующий фрагмент со страницы руководства:

  --binary
      Write all files in binary mode, except for standard output and /dev/tty.  When reading, disable
      the heuristic for transforming CRLF line endings into LF line endings.  This option  is  needed
      on  POSIX systems when applying patches generated on non-POSIX systems to non-POSIX files.  (On
      POSIX systems, file reads and writes never transform line endings. On Windows, reads and writes
      do  transform  line  endings  by default, and patches should be generated by diff --binary when
      line endings are significant.)
13 голосов
/ 17 января 2010

Я сталкивался с этой проблемой раньше несколько раз. Вот что я обнаружил:

  • Команда исправления Linux не распознает файл исправления с CRLF в патче 'meta-lines'.
  • Окончания строк фактического содержимого исправления должны совпадать с окончаниями строк исправляемых файлов.

Так вот что я сделал:

  1. Используйте dos2unix для преобразования файлов исправлений только в LF-окончания.
  2. Используйте dos2unix для преобразования исправляемых файлов только в LF-окончания.
  3. Применить патч.

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

8 голосов
/ 11 февраля 2010

Комбинированный:

dos2unix patchfile.diff
dos2unix $(grep 'Index:' patchfile.diff | awk '{print $2}')
patch --verbose -p0 -i patchfile.diff
unix2dos $(grep 'Index:' patchfile.diff | awk '{print $2}')

Последняя строка зависит от того, хотите ли вы сохранить CRLF или нет.

М.

PS. Это должен был быть ответ на пост cscrimge. DS.

0 голосов
/ 09 августа 2016

Это решение, которое один из наших парней предложил в нашем офисе, поэтому я не беру на себя ответственность, но оно работает для меня здесь.

Иногда мы встречаемся со смешанными окончаниями строк в Linux и Windows в одном и том же файле, и мы также создаем файлы исправлений из Windows и применяем их в Linux.

Если у вас возникла проблема с исправлением после создания файла исправления в Windows или у вас смешанные окончания строк, сделайте следующее:

dos2unix patch-file dos2unix $(sed -n 's/^Index: //p' patch-file) patch -p0 -i patch-file

0 голосов
/ 16 января 2010

perl -i.bak -pe's/\R/\n/g' inputfile для преобразования любой строки, заканчивающейся в стандарт.

...