Estou tentando criar um patch com o comando
git diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
quando aplico o adesivo, 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
Tentei aplicar o dos2unix nos arquivos src e patch, mas a mensagem não foi embora ...
UPD: --ignore-whitespace também não ajuda
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: /programming//a/4425433/1709408
sed -i.bak -e 's/\r$//g' something
. Não acho que o dos2unix lida com o final de linhas misto da forma mais agressiva que você desejar.Respostas:
Eu tive o mesmo problema usando o
patch
comando que acompanha o MSYS2 no Windows. No meu caso, o arquivo de origem e o patch tiveram o final da linha CRLF e a conversão de ambos para LF também não funcionou. O que funcionou foi o seguinte:patch
converterá as terminações de linha em LF em todos os arquivos corrigidos, portanto, é necessário convertê-los novamente em CRLF.Obs: a
patch
versão que estou usando é 2.7.5fonte
Geralmente, você pode contornar isso usando a
-l
opção :Esse é um recurso padrão (consulte a descrição do patch POSIX ).
No entanto, o OP alterou a pergunta para comentar sobre como as conversões de final de linha funcionam com o git core.autocrlf entre diferentes sistemas operacionais e adicionou um exemplo sugerindo que o problema é visto nos arquivos no Windows (em contraste com o exemplo no estilo Unix). Embora
patch
tente acomodar incompatibilidades entre as terminações de linha CRLF e LF, há uma tendência a presumir que o último seja usado. Se o arquivo de correção tivesse terminações de CRLF, enquanto os arquivos a serem corrigidos não, ele se recuperaria como neste exemplo de log:Verificando o código fonte, na
similar
função, o GNUpatch
trata os espaços em branco como spacee Tab, com algum tratamento especial, de acordo com o fato de as linhas terem um LF à direita. CR não é mencionado. Ele presta atençãocheck_line_endings
, mas usa essas informações apenas como parte de uma mensagem para ajudar a diagnosticar uma rejeição. Ele retira os CRs finais em pget_line , a menos que a--binary
opção seja dada.O patch GNU não tem uma opção para dizer a ele para transformar um patch com terminações LF em CRLF para aplicar a arquivos cujas terminações de linha são CRLF. Para usá-lo de maneira confiável neste caso, as opções são
--binary
opçãofonte
Eu tive um problema semelhante no Cygwin. No meu caso, a correção foi usar
-i
flag em vez de ler no stdin.O seguinte falhou com erro de final de linha diferente :
Mas o seguinte foi bem-sucedido:
Não tenho certeza da causa, mas deixo isso aqui caso alguém tenha o mesmo problema.
fonte