2010-07-02 21 views
9

En las ventanas que he creado un diff de varios archivos con:Cómo aplicar diff hecho por Windows SVN en Linux?

svn diff > mydiff.diff 

luego se trasladó a máquina Linux (con la misma versión de la misma cesión temporal, sin cambios). ¿Cómo puedo aplicarlo? Después de ejecutar

patch -p0 < mydiff.diff 

me sale el siguiente resultado:

patching file licstat/test/unittest/test_licstatactioncontainers.cpp 
File licstat/test/unittest/test_licstatactioncontainers.cpp is not empty after patch, as expected 
patching file licstat/test/unittest/test_licstatactions.cpp 
Hunk #1 FAILED at 99. 
1 out of 1 hunk FAILED -- saving rejects to file licstat/test/unittest/test_licstatactions.cpp.rej 
can't find file to patch at input line 295 
Perhaps you used the wrong -p or --strip option? 
The text leading up to this was: 
-------------------------- 
|Index: licstat/test/unittest/test_licenseserverusagemap.cpp 
|=================================================================== 
|--- licstat/test/unittest/test_licenseserverusagemap.cpp  (revision 6767) 
|+++ licstat/test/unittest/test_licenseserverusagemap.cpp  (working copy) 
-------------------------- 
File to patch: 

Y la última línea es rápido a la espera de mi acción.

¿Cómo debo crear/aplicar el parche para que funcione?

(edit) Ahora veo que el archivo falta y diff no lo creó. Después de crear el archivo manualmente recibo errores como este:

patching file licstat/misc/generic/mysql/stored_procedures.sql 
Hunk #1 FAILED at 220. 
Hunk #2 FAILED at 245. 
Hunk #3 FAILED at 622. 
Hunk #4 FAILED at 661. 
Hunk #5 FAILED at 810. 
Hunk #6 FAILED at 822. 
Hunk #7 FAILED at 868. 
Hunk #8 FAILED at 999. 
8 out of 8 hunks FAILED -- saving rejects to file licstat/misc/generic/mysql/stored_procedures.sql.rej 

Respuesta

0

Ese tipo de error puede ocurrir cuando el formato de archivo local es CRLF LF en lugar de cuando se está en un sistema UNIX.

parche intenta adaptar el parche svn diff al formato de archivo Unix, pero se dispara cuando los archivos locales están en modo dos, lo que puede suceder cuando comparte bases de código entre dos y entornos Unix.

Lo que funciona para mí es convertir primero todos los archivos a punto de ser afectados, por ejemplo:

grep ^+++ patchfile.patch | awk '{print $2}' | dos2unix 

Y a continuación, aplicar el parche:

patch -p0 < patchfile.patch 
0

I con bastante regularidad archivos de revisión entre un sistema de Windows y Mac y patch parece que trata las líneas nuevas correctamente, así que no creo que ese sea el problema. Parece que puede haber eliminado test_licstatactioncontainers.cpp y la primera advertencia es sobre eso. El segundo parece estar quejándose de no encontrar el archivo en sí.

¿Podría ser un problema de nombre de archivo? Windows es insensible a la caja del nombre de archivo, pero Linux no lo es. ¿Se llama realmente el archivo Test_LicenceServerUsageMap.cpp en Linux por casualidad? O el directorio LicStat/Test?

+0

Sí, me quita el archivo (con SVN), por lo que debería estar bien. No, todos los nombres de directorio/archivo son minúsculas. – ssobczak

0

Intente convertir los finales de línea en el archivo de parche de DOS a Unix, utilizando el comando dos2unix.

+0

Esto no funciona si el archivo subyacente tiene terminaciones de línea mixtas. – dshin

7

El uso de "dos2unix" no ayudará si tiene línea CR + LF en sus archivos en Linux.

Este comando debe hacer el trabajo con cualquier combinación de avances de línea:

patch -p0 -l --binary < patch.diff 
Cuestiones relacionadas