Wie behebe ich die Meldung "Hunk # 1 FAILED at 1 (different line endings)"?

22

Ich versuche mit dem Befehl einen Patch zu erstellen

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

Wenn ich den Patch anwende, gibt es mir

$ 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

Ich habe versucht, dos2unix sowohl auf die src-Datei als auch auf die Patch-Datei anzuwenden, aber die Meldung ist nicht verschwunden ...

UPD: --ignore-whitespace hilft auch nicht

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: fand einen sehr guten Artikel: /programming//a/4425433/1709408

user1709408
quelle
Versuchen Sie es sed -i.bak -e 's/\r$//g' something. Ich glaube nicht, dass dos2unix so aggressiv mit gemischten Zeilenenden umgeht, wie Sie es möchten.
Arthur2e5
Vollkommen böse; Wenn Sie einen Patch mit CF-LF-Zeilenenden haben, der mit Dateien identisch ist, wird zuerst die CR von Ihrem Patch entfernt und dann eine Anpassung vorgenommen, bei der die Zeilenenden (die gerade unterbrochen wurden) nicht übereinstimmen.
SF.

Antworten:

5

Ich hatte das gleiche Problem mit dem patchBefehl, der mit MSYS2 unter Windows kommt. In meinem Fall hatten sowohl die Quelldatei als auch der Patch ein CRLF-Zeilenende, und das Konvertieren von beiden in LF funktionierte auch nicht. Was funktionierte, war das Folgende:

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

patch konvertiert die Zeilenenden aller gepatchten Dateien in LF, daher ist es notwendig, sie wieder in CRLF zu konvertieren.

Anmerkung: Die von patchmir verwendete Version ist 2.7.5

Fernando Costa Bertoldi
quelle
5

Normalerweise können Sie dies mit der folgenden -lOption umgehen :

Verwenden Sie die Option -l oder --ignore-whitespace, damit Patch leere Zeichen (dh Leerzeichen und Tabulatoren) lose vergleicht, sodass jede nicht leere Folge von Leerzeichen in der Patch-Datei mit jeder nicht leeren Folge von Leerzeichen in den Eingabedateien übereinstimmt

Dies ist eine Standardfunktion (siehe POSIX-Patch- Beschreibung).

OP änderte jedoch die Frage, um zu kommentieren, wie Zeilenende-Konvertierungen mit git core.autocrlf zwischen verschiedenen Betriebssystemen funktionieren , und fügte ein Beispiel hinzu, das andeutet , dass das Problem bei Dateien unter Windows auftritt (im Gegensatz zum Unix-Beispiel). Während patchversucht wird, Fehlanpassungen zwischen CRLF- und LF-Zeilenenden auszugleichen, wird davon ausgegangen, dass letztere verwendet werden. Wenn die Patch-Datei CRLF-Endungen hätte und die zu patchenden Dateien nicht, würde sie wie im folgenden Beispielprotokoll wiederhergestellt:

(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

Beim Überprüfen des Quellcodes in der similarFunktion patchbehandelt GNU Whitespace als spaceund Tabmit einer speziellen Behandlung, die davon abhängt, ob die Zeilen einen nachgestellten LF haben. CR wird nicht erwähnt. Es beachtet zwar check_line_endings, verwendet diese Informationen jedoch nur als Teil einer Nachricht, um die Diagnose einer Ablehnung zu erleichtern. Die nachfolgenden CRs in pget_line werden entfernt, sofern die --binaryOption nicht angegeben ist.

GNU Patch hat keine Option, es anzuweisen, einen Patch mit LF-Endungen in CRLF umzuwandeln, um ihn auf Dateien anzuwenden, deren Zeilenenden CRLF sind. Um es in diesem Fall zuverlässig zu nutzen, haben Sie die Wahl

  • konvertieren Sie alle Dateien, um LF-Endungen zu verwenden, oder
  • konvertieren Sie alle Dateien, um CRLF-Endungen zu verwenden, und fügen Sie die --binaryOption hinzu.
Thomas Dickey
quelle
5
--ignore-whitespace (kein zweiter Strich) hilft auch nicht, ich aktualisierte Frage
user1709408
0

Ich hatte ein ähnliches Problem mit Cygwin. In meinem Fall bestand die Korrektur darin, -iflag zu verwenden, anstatt aus dem stdin zu lesen.

Folgendes ist mit einem anderen Zeilenendefehler fehlgeschlagen :

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

Aber das Folgende ist gelungen:

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

Ich bin mir der Ursache nicht sicher, lasse dies aber hier, falls jemand das gleiche Problem hat.

Joe
quelle