Como corrigir a mensagem “Hunk # 1 FAILED at 1 (different line endings)”?

18

Estou tentando criar um patch com o comando

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

quando eu aplico o patch, isso me dá

$ 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

Eu tentei aplicar dos2unix ao arquivo src e ao arquivo de patch, mas a mensagem não foi ...

UPD: - -ignore-whitespace não ajuda muito

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: encontrou um artigo muito bom: link

    
por user1709408 29.10.2015 / 00:43

2 respostas

4

Eu tive o mesmo problema usando o comando patch que vem com o MSYS2 no Windows. No meu caso, tanto o arquivo de origem quanto o patch tinham terminação de linha CRLF, e a conversão de ambos para LF também não funcionou. O que funcionou foi o seguinte:

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

patch converterá os fins de linha para LF em todos os arquivos corrigidos, então é necessário convertê-los de volta para CRLF.

Obs: a versão patch que estou usando é 2.7.5

    
por 01.02.2017 / 15:27
3

Normalmente, você pode contornar isso usando a -l option :

use the -l or --ignore-whitespace option, which makes patch compare blank characters (i.e. spaces and tabs) loosely so that any nonempty sequence of blanks in the patch file matches any nonempty sequence of blanks in the input files

Este é um recurso padrão (veja a descrição patch POSIX ).

No entanto, o OP alterou a questão para comentar sobre Como as conversões de término de linha funcionam com o git core.autocrlf entre diferentes sistemas operacionais , e adicionamos um exemplo sugerindo que o problema é visto em arquivos no Windows (em contraste com o exemplo do estilo Unix). Enquanto patch tenta acomodar incompatibilidades entre as terminações de linha CRLF e LF, ele tem um viés para presumir que o último é usado. Se o arquivo de patch tivesse terminações CRLF, enquanto os arquivos a serem corrigidos não, ele se recuperaria como neste log de exemplo:

(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

Verificando o código-fonte, na função similar , GNU patch trata os espaços em branco como space e Tab , com algum tratamento especial de acordo com as linhas que têm um LF à direita. CR não é mencionado. Ele presta atenção em check_line_endings , mas usa isso informações apenas como parte de uma mensagem para ajudar a diagnosticar uma rejeição. Ele remove os CRs em pget_line a menos que --binary opção é dada.

O patch GNU não tem uma opção para dizer a ele para transformar um patch com finais LF em CRLF para aplicar em arquivos cujos fins de linha são CRLF. Para usá-lo de forma confiável para este caso, as opções são

  • converte todos os arquivos para usar finais de LF ou
  • converta todos os arquivos para usar as terminações CRLF e adicione a opção --binary .
por 18.11.2015 / 03:27