diff patch

diff - ¿Cómo crear un parche para un directorio completo para actualizarlo?



patch (3)

Sé que ya hay varios hilos sobre esto, pero nadie ha explicado exactamente cómo realizar la diferencia inicial para crear el archivo de parche, y luego cómo aplicar ese parche al directorio inicial para actualizarlo.

En mi caso, hay un directorio de archivos que cualquiera puede descargar de la web. Tomé ese directorio e hice cambios en él, y quiero crear un archivo de parche para que otros puedan aplicarlo al directorio descargado para reproducir exactamente lo que tengo en mi directorio modificado.

¿Ayuda? ¿Qué debo decirle a la otra persona con respecto a cómo aplicar mi parche?


Acabo de tener el mismo problema, muchos consejos sobre cómo hacerlo a medias. Bueno, esto es lo que hice para que funcione tanto el parcheo como el parcheo:

Para crear el archivo de parche:

  1. Coloque copias de ambos directorios en say / tmp, para que podamos crear el archivo de parche, o si es valiente, ponerlos uno al lado del otro en un directorio.

  2. Ejecuta un diff apropiado en los dos directorios, antiguo y nuevo:

    diff -ruN orig/ new/ > file.patch # -r == recursive, so do subdirectories # -u == unified style, if your system lacks it or if recipient # may not have it, use "-c" # -N == treat absent files as empty

Si una persona tiene el directorio orig /, pueden recrear el nuevo ejecutando el parche.

Para volver a crear la nueva carpeta desde la carpeta anterior y el archivo de parche:

  1. Mueva el archivo de parche a un directorio donde existe la carpeta orig /

  2. Esta carpeta quedará destruida, así que conserve una copia de seguridad en alguna parte, o use una copia.

    patch -s -p0 < file.patch # -s == silent except errors # -p0 == needed to find the proper folder

  3. En este punto, la carpeta orig / contiene el nuevo / contenido, pero todavía tiene su nombre anterior, así que:

    mv orig/ new/ # if the folder names are different


Consulte la biblioteca de código abierto Scarab C ++: https://github.com/loyso/Scarab

Hace exactamente lo que describiste. Construye diff por archivo utilizando la biblioteca xdelta y lo coloca en el paquete de archivo. Puede redistribuir ese paquete y aplicar la diferencia. Hay binarios para Win32.

Soy el autor del proyecto Scarab.


Necesitaba crear un archivo de parche y enviarlo a alguien para que pudieran actualizar su directorio para que coincida con el mío. Sin embargo, hay muchas advertencias con diff y patch , por lo que me tomó horas encontrar algo tan conceptual simple. Los caminos absolutos parecen ser preferibles a los caminos relativos, y muchas de las opciones parecen haber evolucionado a partir de casos de uso de nicho. Finalmente descubrí una solución basada en la respuesta de David H , con consejos adicionales de Lakshmanan Ganapathy ):

  • Haga una copia de seguridad de su directory en directory.orig
  • Modifique su directory para alcanzar el estado deseado
  • Guardar diff de directory.orig en el directory en file.patch para que el nombre coincida con el destinatario

Aquí están mis notas:

# to create patch: # copy <directory> backup to something like <directory>.orig alongside it cp -r <path_to>/<directory> <path_to>/<directory>.orig # create/update/delete files/folders in <directory> until desired state is reached # change working directory to <directory> cd <path_to>/<directory> # create patch file alongside <directory> diff -Naru ../<directory>.orig . > ../file.patch # -N --new-file Treat absent files as empty. # -a --text Treat all files as text. # -r --recursive Recursively compare any subdirectories found. # -u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified context. # to apply patch: # change working directory to <directory> cd <path_to>/<directory> patch -s -p0 < <path_to>/file.patch # -s or --silent or --quiet Work silently, unless an error occurs. # -pN or --strip=N Strip smallest prefix containing num leading slashes from files. # to undo patch (note that directories created by patch must be removed manually): # change working directory to <directory> cd <path_to>/<directory> patch -Rs -p0 < <path_to>/file.patch # -R or --reverse Assume that patch was created with the old and new files swapped. # -s or --silent or --quiet Work silently, unless an error occurs. # -pN or --strip=N Strip smallest prefix containing num leading slashes from files.