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


Sé que ya hay varios hilos en esto, pero nadie ha explicado exactamente cómo realizar el diff inicial para crear el archivo de parche, 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. He tomado ese directorio y hecho cambios en él, y quiero crear un archivo de parche para que otros puedan aplicarlo al directorio descargado para reproducir exactamente lo que tener en mi directorio modificado.

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

 59
Author: poundifdef, 2012-04-02

3 answers

Acabo de tener este mismo problema - un montón de consejos sobre cómo hacerlo a la mitad. Bueno, esto es lo que hice para que el parche y el desempaquetado funcionaran:

Para crear el archivo de Parche:

  1. Poner copias de ambos directorios en say / tmp, para que podamos crear el parche archivo, o si valiente, conseguirlos lado a lado - en un directorio.

  2. Ejecute 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/, puede recrear el nuevo ejecutando patch.

Para recrear la nueva carpeta desde la carpeta antigua y el archivo de parche:

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

  2. Esta carpeta será golpeada, así que mantenga una copia de seguridad de ella en algún lugar, o usa 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 aún tiene su antiguo nombre, así que:

    mv orig/ new/    # if the folder names are different
    
 107
Author: David H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-15 03:16:29

Echa un vistazo a la biblioteca de código abierto Scarab C++: https://github.com/loyso/Scarab

Hace exactamente lo que usted describió. Construye diff por archivo usando la biblioteca xdelta y lo coloca en el paquete archive. Puede redistribuir ese paquete y aplicar la diferencia. Hay binarios para Win32.

Soy el autor de Scarab project.

 1
Author: Alexey Baskakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-26 20:26:52

Necesitaba crear un archivo de parche y enviarlo a alguien para que pudiera actualizar su directorio para que coincida con el mío. Hay muchas advertencias con diff y patch sin embargo, por lo que terminó llevándome horas para averiguar algo tan conceptualmente simple. Las rutas absolutas parecen preferirse a las rutas relativas, 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):

  • Copia de seguridad de su directory a directory.orig
  • Modifica tu directory para alcanzar el estado deseado
  • Guardar diff de directory.orig a directory en {[6] } así que el nombre coincide 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.
 0
Author: Zack Morris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-02 21:28:21