it-swarm.com.de

Wie kann ich die Meldung "Hunk # 1 FAILED at 1 (verschiedene Zeilenenden)" beheben?

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 Nachricht 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: https://stackoverflow.com/a/4425433/1709408

23
user1709408

Ich hatte das gleiche Problem mit dem Befehl patch, der mit MSYS2 unter Windows geliefert wird. In meinem Fall hatten sowohl die Quelldatei als auch der Patch ein CRLF-Zeilenende und die Konvertierung 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 in alle gepatchten Dateien in LF, daher ist es notwendig, sie wieder in CRLF zu konvertieren.

Obs: Die Version patch, die ich verwende, ist 2.7.5

Sie können dies normalerweise mit -l Option :

verwenden Sie die Option -l oder --ignore-whitespace, mit der Patch-Leerzeichen (d. h. Leerzeichen und Tabulatoren) lose verglichen werden, 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 hat die Frage jedoch geändert, um zu kommentieren Wie Konvertierungen am Zeilenende mit git core.autocrlf zwischen verschiedenen Betriebssystemen funktionieren und Es wurde ein Beispiel hinzugefügt, das darauf hinweist, dass das Problem bei Dateien unter Windows auftritt (im Gegensatz zum Beispiel im Unix-Stil). Während patch versucht, Fehlanpassungen zwischen CRLF und LF Zeilenenden) auszugleichen, wird davon ausgegangen, dass letzteres verwendet wird. Wenn die Patch-Datei CRLF-Endungen hatte, während die Dateien, die gepatcht werden sollten, wurden nicht wiederhergestellt, wie in diesem Beispielprotokoll:

(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 Funktion similar behandelt GNU patch Leerzeichen als space und Tab, mit einer speziellen Behandlung, je nachdem, ob die Leitungen einen nachlaufenden LF haben. CR wird nicht erwähnt. Es achtet in check_line_endings , verwendet diese Informationen jedoch nur als Teil einer Nachricht, um die Diagnose einer Ablehnung zu unterstützen. Die nachfolgenden CRs werden in pget_line entfernt, es sei denn, --binary Option ist gegeben.

Der GNU-Patch verfügt nicht über die Option, einen Patch mit LF-Endungen in CRLF umzuwandeln, um ihn auf Dateien anzuwenden, deren Zeilenenden CRLF sind. Um ihn in diesem Fall zuverlässig zu verwenden, stehen folgende Optionen zur Auswahl

  • konvertieren Sie alle Dateien in LF Endungen, oder
  • konvertieren Sie alle Dateien, um CRLF-Endungen zu verwenden, und fügen Sie das --binary Möglichkeit.
5
Thomas Dickey

Ich hatte ein ähnliches Problem mit Cygwin. In meinem Fall war das Update die Verwendung von -i flag anstatt aus dem stdin zu lesen.

Folgendes ist mit verschiedene Zeilenenden Fehler fehlgeschlagen:

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

Aber das gelang:

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

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

0
Joe