2010-01-16 1 views
9

Patch linux standard codé en dur uniquement pour les fichiers texte Unix. PS: Je ne veux pas convertir TOUS en UNIX, puis convertir le résultat en retour.Comment utiliser les correctifs créés dans Windows (avec CRLF) sous Linux? I

+0

Pourquoi avez-vous des fichiers texte (apparemment un lot de) avec CRLF fin de ligne sur un système Unix? –

+0

sources pour ARM qui précédemment croisé sur win32. –

+0

La commande dos2unix va-t-elle réparer le fichier? –

Répondre

0

perl -i.bak -pe's/\R/\n/g' inputfile pour convertir n'importe quelle ligne se terminant à la norme.

+0

Merci, c'est intéressant mais pas applicable dans ma situation. –

+0

Il répond à la question dans le titre si le diff est basé sur des lignes, comme ils le sont habituellement. – Anonymous

11

J'ai déjà rencontré ce problème plusieurs fois. C'est ce que j'ai découvert:

  • La commande de patch Linux ne reconnaîtra pas un fichier patch ayant un CRLF dans les méta-lignes du patch.
  • Les fins de ligne du contenu réel du correctif doivent correspondre aux fins de ligne des fichiers en cours de correction.

donc ce que je l'ai fait:

  1. Utilisez dos2unix pour convertir les fichiers de patch à LF fins de ligne seulement.
  2. Utilisez dos2unix pour convertir les fichiers en cours de correction en fins de ligne LF uniquement.
  3. Appliquer le correctif.

Vous pouvez utiliser unix2dos pour convertir les fichiers corrigés en fins de ligne CRLF si vous souhaitez conserver cette convention.

7

Combiné:

dos2unix patchfile.diff 
dos2unix $(grep 'Index:' patchfile.diff | awk '{print $2}') 
patch --verbose -p0 -i patchfile.diff 
unix2dos $(grep 'Index:' patchfile.diff | awk '{print $2}') 

La dernière ligne dépend si vous voulez garder les CRLFs ou non.

M.

PS. Cela aurait dû être une réponse à la publication de cscrimge. DS.

+2

Ce qui a fonctionné pour moi était ce qui précède, mais je préfère «+++» plutôt que «Index:». – nullPainter

13

Utilisez l'option --binary. Voici l'extrait pertinent de la page man:

--binary 
     Write all files in binary mode, except for standard output and /dev/tty. When reading, disable 
     the heuristic for transforming CRLF line endings into LF line endings. This option is needed 
     on POSIX systems when applying patches generated on non-POSIX systems to non-POSIX files. (On 
     POSIX systems, file reads and writes never transform line endings. On Windows, reads and writes 
     do transform line endings by default, and patches should be generated by diff --binary when 
     line endings are significant.) 
+0

Cela semble être la meilleure option.+1 Dommage qu'il n'y ait pas (?) Quelque chose comme: essayer de patcher sans le drapeau binaire, et pour ceux qui échouent réessayer avec binaire le drapeau binaire. – Qtax

+0

Il semble étrange que "patch Samuel

0

Ceci est une solution un de nos gars est venu avec dans notre bureau, donc je ne suis pas prendre le crédit pour cela, mais ça fonctionne pour moi ici.

Nous avons parfois une situation de terminaisons de lignes mixtes Linux et Windows dans le même fichier, et nous créons également des fichiers de correctifs à partir de Windows et les appliquons sur Linux.

Si vous rencontrez un problème de correctif après avoir créé votre fichier patch sur Windows ou que vous avez mélangé les fins de ligne font alors ceci:

dos2unix patch-file dos2unix $(sed -n 's/^Index: //p' patch-file) patch -p0 -i patch-file

Questions connexes