2011-09-20 15 views
21

Escenario: Tengo un archivo de parche que se aplica limpiamente a mis archivos de trabajo, pero no quiero todos los cambios del parche.¿Cómo se edita un archivo diff/patch limpiamente? ¿Hay algún editor de archivos parche?

Normalmente, hago vim example.patch, elimino los cambios no deseados y ellos aplican patch -p0 -i example.patch pero a veces el parche no se aplica limpiamente, y tengo que comenzar de nuevo.

¿Hay un editor de archivos de parche que permita a los usuarios editar y eliminar parte del parche y aún así pueda aplicarlo limpiamente?

+0

¿Por qué no crear un segundo parche? – Johnsyweb

+2

Ver http://stackoverflow.com/questions/242646/use-vimdiff-with-a-diff-file – dmedvinsky

+0

Necesito aquí. Necesito editar los archivos de parche antes de aplicarlos y no hay forma de generar otro parche. Entonces, ¿hay un editor de archivos de parches que permita a los usuarios editar y/o eliminar parte del parche y aún así puedan aplicarlo limpiamente? –

Respuesta

1

No edite los archivos de parche manualmente. En su caso, puede probar alguna herramienta interactiva para aplicar su trozo de parche por trozo, como ipatch

14

Si abre un archivo diff en emacs y pone el editor en modo "diff", puede editar parches y se actualizará los marcadores de trozos de una manera inteligente. ¡Funciona muy bien para mí!

+0

¡Sí! ¡Gracias! Esto lo hace perfectamente! –

2

¿Qué SCM usas? si se utiliza Git puede:

  • Antes de generar el parche real git add -p utilizar para agregar sólo partes de los cambios. Es una buena práctica generar compromisos más pequeños con solo cambios relacionados (sin embargo, a algunas organizaciones no les gusta esto y solo permiten un megacompromiso).

  • Si ya tiene el parche, aplíquelo usando git add -p para agregar las partes del código que desea mantener en su índice. Puede comprometer y descartar el resto (git co .) o esconderlo (git stash).

edición (basado en el git add comment -p)

  • git add -p le permite dividir un trozo en pedazos más pequeños mediante la opción s, en los casos cuando se necesita más detalle necesita utilizar la opción e para editar, que lo llevará a su editor de gitconfig y tendrá las instrucciones sobre cómo editar el trozo.
+0

Tengo este problema exactamente cuando uso 'git add -p' (es decir, en" Modo de edición manual de trozos ") ya que a veces no es posible dividir el diff en clean hunks y se necesita una edición manual de diff. – Jawa

+0

El problema con 'git add -p' es que solo ofrece una pequeña parte de la funcionalidad que' git diff' (y su controlador subyacente) ofrece. Por ejemplo, si quiero dar sentido a los cambios que he hecho antes de comprometerme, usando el indicador '-w' para' git diff' para ignorar el espacio en blanco, eso me ayuda si no quiero 'git add -p' algunos de estos cambios de forma interactiva, porque no hay '-w' para' git add'. Lo que hacen las personas es que generan el archivo de parche con 'git diff -w ...' y luego usan 'git apply', pero eso los trae nuevamente a un editor de parches, ya que' git add' no está ahí para ayudar ellos. – amn

5

Si está buscando una solución no interactiva, rediff de patchutils es de ayuda.

He aquí su descripción man:

Puede utilizar rediff para corregir un diff unificado editado a mano. Tome una copia del diff que desea editar y edítelo sin cambiar los desplazamientos o conteos (las líneas que comienzan con "@@"). Luego ejecute rediff, diciéndole el nombre del archivo diff original y el nombre del que tiene editado, y dará salida al archivo diff editado pero con correcciones corregidas y conteos.

Se proporciona un pequeño script, editdiff, para editar un archivo diff en contexto.

Los tipos de cambios que se manejan actualmente son:

  • Modificar el texto de cualquier línea de contenido de archivos (por supuesto).
  • Adición de nuevas inserciones o eliminaciones de línea.
  • Agregar, cambiar o eliminar líneas de contexto. Las líneas en el horizonte de contexto se manejan ajustando el desplazamiento y/o conteo.
  • Agregando un solo trozo (@@ - sección prefijada).
  • Eliminación de múltiples hunk (@@ - secciones prefijadas).

Sobre la base de su descripción, recountdiff también podría ser un candidato potencial para fijar diffs unificados.

Cuestiones relacionadas