2010-08-13 24 views
5

Por ejemplo, si tengo dos archivos:No se puede aplicar el parche diff unificado en Solaris

fichero1:

This is file 1 

y fichero2:

This is file 2 

y crear el parche con la siguiente comando:

diff -u file1 file2 > files.patch 

resultado es:

--- file1  Fri Aug 13 17:53:28 2010 
+++ file2  Fri Aug 13 17:53:38 2010 
@@ -1,1 +1,1 @@ 
-This is file 1 
+This is file 2 

Entonces si intento de aplicar este parche en Solaris con el comando patch:

patch -u -i files.patch 

que cuelga en:

Looks like a unified context diff. 
File to patch: 

1. ¿Hay una manera de utilizar Solaris comando de parche nativo con diffs unificados?

2. ¿Qué formato de diferencia se considera más portátil si no es posible aplicar un formato unificado?

Actualización: que he encontrado respuesta en la primera parte de mi pregunta. Parece que patch en Solaris se cuelga si el segundo archivo (archivo2 en este caso) existe en la misma carpeta que el primero (archivo1). Por ejemplo, la siguiente diff bastante común:

--- a/src/file.src  Sat Aug 14 23:07:29 2010 
+++ b/src/file.src  Sat Aug 14 23:07:37 2010 
@@ -1,2 +1,1 @@ 
-1 
- 
+2 

no funcionará con el comando bastante común parche:

patch -p1 -u -d a < file.patch 

mientras que el siguiente diff (segundo archivo nota se cambia el nombre):

--- a/src/file.src  Sat Aug 14 23:07:29 2010 
+++ b/src/file_new.src  Sat Aug 14 23:07:37 2010 
@@ -1,2 +1,1 @@ 
-1 
- 
+2 

funcionará perfectamente.

Para la segunda parte de mi pregunta, vea la respuesta aceptada a continuación.

Respuesta

0

Single Unix v2 y v3 admiten diffs de contexto pero no diferencias unificadas, por lo que para una mejor portabilidad debe usar contextos diffs (opción -c a diff y patch).

En versiones de Solaris de más edad (pre-10, creo), es necesario asegurarse de que es /usr/xpg4/bin antes /usr/bin en su $PATH, de lo contrario puede obtener versiones de compatibilidad de algunos servicios públicos en lugar de los estándar.

+1

Gracias, Gilles por las explicaciones. Consideraré usar diferencias de contexto. Por lo que yo entiendo, no puedes escribir en la información del parche de diferencia de contexto sobre el archivo fuente para cambiar. ¿Estoy en lo cierto? No es muy conveniente ... De todos modos, todavía no puedo entender por qué no ejecuté el parche -u con diff producido por diff -u. – Shcheklein

+0

@Shcheklein: ¿Qué quiere decir con "información de parche sobre el archivo de origen para cambiar"? Las diferencias de contexto incluyen nombres de archivos. POSIX requiere 'diff -cr' para ser compatible, por lo que esto tiene que funcionar. Por cierto, ¿'parche -p0' hace la diferencia? – Gilles

+0

Sí, las diferencias de contexto incluyen suficiente información. Sin embargo, el problema con el 'parche' de Solaris era diferente (ver la actualización de la pregunta). '-p0' no hace ninguna diferencia. Parece que 'patch' en Solaris no le gusta cuando ambos nombres en hunk son iguales o ambos archivos existen. – Shcheklein

6

En Solaris /usr/bin/patch es una versión antigua necesaria para cumplir con algunos estándares antiguos. Se proporciona una versión moderna del parche GNU como /usr/bin/gpatch en Solaris 8 y versiones posteriores.

+0

lo sé. Es posible que gpatch no esté instalado de manera predeterminada y no sea muy bueno cuando falla la compilación de su producto porque no hay ningún gpatch. – Shcheklein

2
diff -cr old.new new.txt > patch.txt 

gpatch -p0 < patch.txt 

Funciona perfectamente para mí (usando gpatch)

Cuestiones relacionadas