web-dev-qa-db-fra.com

Comment corriger le message "Hunk # 1 FAILED at 1 (different line endings)" message?

J'essaie de créer un patch avec la commande

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

quand j'applique le patch, ça me donne

$ 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

J'ai essayé d'appliquer dos2unix au fichier src et au fichier patch, mais le message n'a pas disparu ...

UPD: --ignore-whitespace n'aide pas trop

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: a trouvé un très bon article: https://stackoverflow.com/a/4425433/1709408

23
user1709408

J'ai eu le même problème en utilisant la commande patch fournie avec MSYS2 sous Windows. Dans mon cas, le fichier source et le correctif avaient une fin de ligne CRLF, et la conversion des deux en LF n'a pas fonctionné non plus. Ce qui a fonctionné était le suivant:

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

patch convertira les fins de ligne en LF sur tous les fichiers corrigés, il est donc nécessaire de les reconvertir en CRLF.

Obs: la version patch que j'utilise est la 2.7.5

6

Vous pouvez généralement contourner ce problème en utilisant -l option :

utilisez l'option -l ou --ignore-whitespace, qui permet aux patchs de comparer les caractères vides (c'est-à-dire les espaces et les tabulations) de manière lâche afin que toute séquence de blancs non vide dans le fichier de patch corresponde à toute séquence non vide de blancs dans les fichiers d'entrée

C'est une fonctionnalité standard (voir Patch POSIX description).

Cependant, OP a modifié la question pour commenter Fonctionnement des conversions de fin de ligne avec git core.autocrlf entre différents systèmes d'exploitation, et ajouté un exemple indiquant que le problème est observé avec les fichiers sous Windows (contrairement à l'exemple de style Unix). Alors que patch essaie de prendre en charge les décalages entre CRLF et LF fins de ligne, il a un biais pour supposer que cette dernière est utilisée. Si le fichier de correctif avait des terminaisons CRLF, alors que le les fichiers à patcher ne l'ont pas fait, il récupérerait comme dans cet exemple de journal:

(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

Vérification du code source, dans la fonction similar , GNU patch traite les espaces comme space et Tab, avec un traitement spécial selon que les lignes ont un LF de fin. CR n'est pas mentionné. Il fait attention à check_line_endings , mais utilise ces informations uniquement dans le cadre d'un message pour aider à diagnostiquer un rejet. Il supprime les CR de fin dans pget_line sauf si le --binary option est donnée.

Le patch GNU n'a pas d'option pour lui dire de transformer un patch avec les terminaisons LF en CRLF à appliquer aux fichiers dont les fins de ligne sont CRLF. Pour l'utiliser de manière fiable dans ce cas, les choix sont les suivants:

  • convertir tous les fichiers pour utiliser LF terminaisons, ou
  • convertir tous les fichiers pour utiliser les terminaisons CRLF et ajouter le --binary option.
5
Thomas Dickey

J'ai eu un problème similaire sur Cygwin. Dans mon cas, le correctif consistait à utiliser -i flag au lieu de lire dans le stdin.

L'erreur suivante a échoué avec différentes fins de ligne erreur:

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

Mais ce qui suit a réussi:

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

Je ne suis pas sûr de la cause, mais laisser cela ici au cas où quelqu'un aurait le même problème.

0
Joe