Come risolvere il messaggio "Hunk # 1 FAILED at 1 (terminazioni di riga diverse)"?


22

Sto cercando di creare una patch con il comando

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

quando applico la patch, mi 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

Ho provato ad applicare dos2unix sia al file src che al file patch, ma il messaggio non è andato ...

UPD: --ignore-whitespace non aiuta anche

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: trovato un ottimo articolo: /programming//a/4425433/1709408


Prova sed -i.bak -e 's/\r$//g' something. Non credo che dos2unix gestisca i fine linea misti in modo aggressivo come si potrebbe desiderare.
Arthur2e5,

Completamente malvagio; se hai la tua patch con terminazioni di linea CF-LF, come per i file, per prima cosa toglierà felicemente il CR dalla tua patch, quindi si adatta alla fine delle linee (che ha appena rotto) non corrispondono.
SF.

Risposte:


5

Ho avuto lo stesso problema utilizzando il patchcomando fornito con MSYS2 su Windows. Nel mio caso, sia il file sorgente che la patch avevano la fine della linea CRLF e neanche la conversione in LF funzionava. Ciò che ha funzionato è stato il seguente:

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

patch convertirà le terminazioni di riga in LF su tutti i file con patch, quindi è necessario riconvertirle in CRLF.

Obs: la patchversione che sto usando è 2.7.5


5

Di solito puoi aggirare questo usando l' -lopzione :

usare l'opzione -l o --ignore-whitespace, che rende la patch un confronto di caratteri vuoti (ovvero spazi e tabulazioni) liberamente in modo che qualsiasi sequenza non vuota di spazi nel file patch corrisponda a qualsiasi sequenza non vuota di spazi nei file di input

Questa è una funzione standard (vedere la descrizione della patch POSIX ).

Tuttavia, OP ha modificato la domanda per commentare come funzionano le conversioni di fine riga con git core.autocrlf tra diversi sistemi operativi e ha aggiunto un esempio che suggerisce che il problema si verifica con i file su Windows (contrariamente all'esempio in stile Unix). Mentre patchcerca di compensare i disallineamenti tra le terminazioni di linea CRLF e LF, ha una propensione a presumere che venga utilizzato quest'ultimo. Se il file di patch avesse terminazioni CRLF, mentre i file da correggere non lo avrebbero fatto, si ripristinerebbe come in questo registro di esempio:

(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

Controllando il codice sorgente, nella similarfunzione, GNU patchconsidera gli spazi bianchi come spacee Tab, con una certa gestione speciale a seconda che le linee abbiano un LF finale. CR non è menzionato. Presta attenzione check_line_endings, ma utilizza tali informazioni solo come parte di un messaggio per aiutare a diagnosticare un rifiuto. Elimina i CR finali in pget_line a meno che non --binarysia data l' opzione.

La patch GNU non ha un'opzione per dirgli di trasformare una patch con terminazioni LF in CRLF da applicare ai file le cui terminazioni sono CRLF. Per usarlo in modo affidabile per questo caso, le scelte sono

  • convertire tutti i file per utilizzare le terminazioni LF o
  • converti tutti i file per utilizzare le terminazioni CRLF e aggiungi l' --binaryopzione.

5
--ignore-whitespace (nessun secondo trattino) non aiuta troppo, ho aggiornato la domanda
user1709408

0

Ho avuto un problema simile su Cygwin. Nel mio caso, la soluzione era usare -iflag invece di leggere dallo stdin.

Non riuscito con errore di terminazione di riga diverso :

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

Ma quanto segue è riuscito:

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

Non sono sicuro della causa, ma lasciarlo qui nel caso in cui qualcuno abbia lo stesso problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.