ti-enxame.com

O que significa 'patch inesperadamente termina no meio da linha'?

Esta é a saída do meu comando patch:

Hunk #11 merged at 4184,4190.
Hunk #12 merged at 4444.
Hunk #13 merged at 4944.
Hunk #14 NOT MERGED at 5106-5116.
Hunk #15 merged at 5290.
Hunk #16 merged at 5448.
patch unexpectedly ends in middle of line
Hunk #17 merged at 5608,5611.

O comando era

patch -d ~/SOME_DIR -p1 --merge --verbose -u

O patch foi produzido usando git:

git --git-dir ~/SOME_DIR/.git diff -U8 bb1ee538982957b421a4c0e78f30428e73c9a072 HEAD -- malloc.c

O que patch unexpectedly ends in middle of line quer dizer, e isso é um problema? Está se referindo ao pedaço 16 ou 17? O que posso procurar no arquivo de patch para descobrir o que está causando isso?

14
Paul Biggar

A mensagem se refere a Hunk 16.

Isso discussão no GitHub provavelmente está relacionado ao seu problema.

É sobre patch termina inesperadamente no meio de mensagens de linha por causa de problemas de CRLF (retorno de carro, alimentação de linha) quando diffs gerados por git são usados ​​com patch.

Para citar a conclusão:

[..] git pode ser muito exigente quanto ao final da linha. Você está no windows ou não? De qualquer forma, você provavelmente deve definir autocrlf na configuração do git. Se você estiver no windows, você quer "true", se você estiver no mac ou linux, você deve usar "input" [..]

No artigo Lidando com terminações de linha GitHub detalha a declaração acima.

11
maxschlepzig

Se você não estiver usando git (o comentário de @maxslepzig foi sobre o uso de patch no contexto de git), tente adicionar um retorno de carro no final de seu arquivo. Eu fiz isso e patch aceitou meu patch.

3
Avery Chan

Para adicionar a esta discussão muito antiga:

O problema que levou ao aviso observado pelo OP é geralmente causado por problemas com terminações de linha.

patchdeseja um feed de linha final (LF) para determinar o final do arquivo (e avisa sobre um diff unificado que pode ter sido acidentalmente truncado)

  1. Acrescente o feed de linha adequado sem abrir o arquivo para edição (o que pode modificar o final de sua linha ou remover linhas/espaços finais dependendo das configurações do seu editor), você pode fazer algo simples como:

    echo -e "\n" >> YOURPATCHFILE

    Isso acrescenta um caractere de avanço de linha ao final do arquivo sem fazer nenhuma outra alteração.

  2. Se o seu arquivo de patch já é estranho ou você deseja passar por várias correções possíveis de uma vez, você pode corrigir muitos problemas com a codificação (para ascii), incluindo as terminações de linha (CR ou CRLF para LF):

    dos2unix -k YOURPATCHFILE

    Você pode ter que instalar o binário dos2unix a partir do gerenciador de pacotes do seu sistema operacional; ou seja,.

    • Baseado em Debian/Ubuntu: Sudo apt install dos2unix
    • Fedora/RHEL/CentOS: Sudo yum install dos2unix
    • MacOS (com cerveja): brew install dos2unix
2
ChrisN