2010-01-16 4 views
9

Parche de Linux estándar codificado rígido solo para archivos de texto unix.Cómo usar parches creados en Windows (con CRLF) en Linux? I

PD: No quiero convertir TODO a Unix y luego convertir el resultado.

+0

¿Por qué tienes (al parecer una gran cantidad de) archivos de texto con CRLF finales de línea en un sistema Unix? –

+0

fuentes para ARM que anteriormente se desarrollaron de forma cruzada en win32. –

+0

¿Arreglará el archivo el comando dos2unix? –

Respuesta

0

perl -i.bak -pe's/\R/\n/g' inputfile para convertir cualquier línea que termine en el estándar.

+0

Gracias, está interesado pero no es aplicable en mi situación. –

+0

Responde la pregunta en el título si la diferencia se basa en líneas, como suele ser. – Anonymous

11

Me he encontrado con este problema varias veces. Esto es lo que descubrí:

  • El comando de parche de Linux no reconocerá un archivo parche que tenga CRLF en el parche 'meta-líneas'.
  • Las terminaciones de línea del contenido del parche real deben coincidir con los finales de línea de los archivos que se están parcheando.

Así que esto es lo que hice:

  1. Uso dos2unix para convertir archivos de revisión a LF sólo el fin de línea.
  2. Utilice dos2unix para convertir los archivos que se están parcheando a terminaciones de línea LF solamente.
  3. Aplicar parche.

Puede usar unix2dos para convertir archivos parcheados a terminaciones de línea CRLF si desea mantener esa convención.

7

Combinado:

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 última línea depende de si desea mantener los CRLFs o no.

M.

PS. Esto debería haber sido una respuesta a la publicación de cscrimge. DS.

+2

Lo que funcionó para mí fue lo que antecede, pero se reemplazó por '+++' en lugar de 'Índice:'. – nullPainter

13

Utilice la opción --binary. Aquí está el fragmento relevante de la página 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

Esta parece ser la mejor opción.+1. Lástima que no haya (?) Algo así como: intente parchear sin la bandera binaria, y para aquellos que fallan vuelva a intentar con la bandera binaria binaria. – Qtax

+0

Parece raro que "patch Samuel

0

Ésta es una solución de uno de los nuestros se le ocurrió en nuestra oficina, así que no estoy tomando el crédito para él, pero funciona para mí aquí.

A veces tenemos una situación de linux mixto y terminaciones de línea de Windows en el mismo archivo, y también creamos archivos de parche desde Windows y los aplicamos en linux.

Si usted es experimentar un problema parche después de crear el archivo de parche en las ventanas o se han mezclado los finales de línea y luego hacer esto:

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

Cuestiones relacionadas