2011-09-01 9 views
5
  1. He eliminado algunos archivos de texto usando svn remove. Pero svn diff muestra como eliminación de todo el contenido del archivo. La aplicación de un parche de esa diferencia solo modifica el contenido, no elimina el archivo.Obtenga un parche correspondiente después de hacer svn remove y svn rename

  2. Cambié el nombre de un directorio que contiene archivos binarios usando svn rename. Un archivo de parche desde un svn diff normal no hace nada.

How to make svn diff produce file that patch would apply, when svn cp or svn mv was used?

subversion diff including new files

Tanto los métodos en los enlaces de arriba hace únicas modificaciones a los archivos. No se eliminan/cambian de nombre después de aplicar un parche. ¿Es posible obtener un parche de trabajo para los cambios anteriores?

+0

¿Ha registrado el contenido sobre el que aplicó el parche? – JVerstry

+0

@JVerstry No entiendo muy bien su pregunta. Comprueve una copia diferente de svn repo y traté de aplicarle los parches, para probar si funciona. – Nufail

+0

Cuando aplica el parche, la información solo se registra en archivos ocultos .svn. Sin embargo, un archivo solo se eliminará DESPUÉS de que ingrese la copia diferente de este svn repo. – JVerstry

Respuesta

5

Desde la página patch hombre:

-E o --remove-empty-archivos eliminar archivos de salida que están vacíos después de que se han aplicado los parches . Normalmente esta opción es innecesaria, ya que el parche puede examinar las marcas de tiempo en el encabezado para determinar si un archivo debe existir después de parchear. Sin embargo, si la entrada no es un contexto diff o si el parche es compatible con POSIX, el parche no elimina los archivos vacíos parcheados a menos que se proporcione esta opción. Cuando el parche elimina un archivo, también intenta eliminar cualquier directorio ancestro vacío.

1

Prueba esto:

patch -p0 -E < 1.patch && svn rm `svn st -q | grep ^! | cut -c 9-` 
+0

Gracias. Esta solución resuelve el primer problema. – Nufail

1

Creo segunda edición de la OP es causada por un error de SVN que se fijó en el SVN 1.7. Cambia una estructura de directorio (mover, cambiar el nombre, eliminar) y confirmarla, pero cuando usa svn diff, el parche parece "no hacer nada".

Tuve este problema al eliminar directorios y los síntomas son los mismos, así que supongo que estamos experimentando el mismo "error de raíz". Para mí, la actualización a svn 1.7 lo resolvió, porque svn 1.7 genera diffs (parches) de manera diferente.

¡Algunas versiones de svn diff no ponen los archivos movidos/renombrados/borrados en el diff en absoluto!

Ver: http://svn.haxx.se/dev/archive-2004-03/0333.shtml. Este correo electrónico archivado de la lista SVN DEV muestra que los desarrolladores mismos identificaron este problema, en algún momento antes del lanzamiento de 1.0.1, hace más de una década. Si sigues el hilo, parecían bastante determinados a solucionarlo en ese momento, pero incluso 1.6 también dejaba cosas fuera del diferencial. Tuve que actualizar a 1.7.

Básicamente, si svn < 1.7 detectó que un directorio era svn delete 'd, no recurría y procesaba los hijos, simplemente se detenía allí y no ponía nada debajo de ese árbol en el diff. Esto no es lo que queremos, queremos eliminaciones explícitas para TODOS los niños, para que el parche pueda, como se menciona en otra respuesta, eliminar los archivos y directorios vacíos a través de -E. Patch no puede hacer nada si el archivo no está en el parche.

Usando svn 1.7 Hice una diferencia idéntica a la que tenía antes, pero todos los archivos debajo de un directorio eliminado estaban explícitamente en el parche como tener todas las líneas eliminadas (vaciar), y luego patch/quilt eliminaron con éxito los archivos y carpetas. Supongo que algo similar debe suceder en tu caso con el movimiento o el cambio de nombre.

GOTCHAS: La actualización a 1.7 dejará inutilizadas sus copias de trabajo. Asegúrese de confirmar los cambios antes de realizar la actualización. Luego tienes que pagar todo de nuevo. Editar: El cliente SVN 1.7 puede reparar sus directorios de trabajo, pero si no puede necesitar realizar la extracción de nuevo. Solo ten en cuenta para que no pierdas el trabajo.

Cuestiones relacionadas