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'est pas parti ...
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: /programming//a/4425433/1709408
sed -i.bak -e 's/\r$//g' something
. Je ne pense pas que dos2unix gère les extrémités de lignes mixtes aussi agressivement que vous le souhaitez.Réponses:
J'ai eu le même problème en utilisant la
patch
commande fournie avec MSYS2 sous Windows. Dans mon cas, le fichier source et le correctif avaient une fin de ligne CRLF, et la conversion en LF n'a pas fonctionné non plus. Ce qui a fonctionné était le suivant: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
patch
version que j'utilise est la 2.7.5la source
Vous pouvez généralement contourner ce problème en utilisant l'
-l
option :Il s'agit d'une fonctionnalité standard (voir la description du patch POSIX ).
Cependant, OP a modifié la question pour commenter comment les conversions de fin de ligne fonctionnent avec git core.autocrlf entre différents systèmes d'exploitation , et a ajouté un exemple indiquant que le problème est observé avec les fichiers sous Windows (contrairement à l'exemple de style Unix). Tout en
patch
essayant de tenir compte des disparités entre les terminaisons de ligne CRLF et LF, il a un biais pour présumer que cette dernière est utilisée. Si le fichier de correctif avait des terminaisons CRLF, alors que les fichiers à corriger n'en avaient pas, il récupérerait comme dans cet exemple de journal:En vérifiant le code source, dans la
similar
fonction, GNUpatch
traite les espaces comme spaceet Tab, avec une gestion spéciale selon que les lignes ont un LF final. CR n'est pas mentionné. Il fait attentioncheck_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 l'--binary
option est donnée.Le patch GNU n'a pas d'option pour lui dire de transformer un patch avec des terminaisons LF en CRLF à appliquer aux fichiers dont les terminaisons de ligne sont CRLF. Pour l'utiliser de manière fiable dans ce cas, les choix sont
--binary
option.la source
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 une erreur de fin de ligne différente :
Mais ce qui suit a réussi:
Je ne suis pas sûr de la cause, mais laisser cela ici au cas où quelqu'un aurait le même problème.
la source