web-dev-qa-db-fra.com

Comment créer un patch pour tout un répertoire pour le mettre à jour?

Je sais qu'il existe déjà plusieurs threads à ce sujet, mais personne n'a expliqué en détail comment utiliser le diff initial pour créer le fichier correctif, puis comment appliquer ce correctif dans le répertoire initial pour le mettre à jour.

Dans mon cas, il existe un répertoire de fichiers que tout le monde peut télécharger du Web. J'ai pris ce répertoire et apporté des modifications à celui-ci, et je souhaite créer un fichier de correctif tel que d'autres puissent l'appliquer au répertoire téléchargé pour reproduire exactement ce que j'ai dans mon répertoire modifié.

Aidez-moi? Que dois-je dire à l'autre personne pour savoir comment appliquer mon patch?

63
poundifdef

Je viens d'avoir ce même problème - beaucoup de conseils sur la façon de le faire à moitié. Eh bien, voici ce que j'ai fait pour que les correctifs et les correctifs fonctionnent:

Pour créer le fichier de correctif:

  1. Placez des copies des deux répertoires dans/tmp, pour pouvoir créer le fichier de correctif ou, s’ils sont courageux, les mettre côte à côte - dans un seul répertoire.

  2. Exécutez un diff approprié sur les deux répertoires, ancien et nouveau:

    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 une personne possède le répertoire orig /, elle peut recréer le nouveau en exécutant patch.

Pour recréer le nouveau dossier à partir de l'ancien dossier et du fichier de correctif:

  1. Déplacez le fichier de correctif dans un répertoire contenant le dossier orig /

  2. Ce dossier sera obstrué, alors gardez une copie de sauvegarde quelque part ou utilisez une copie.

    patch -s -p0 < file.patch
    # -s == silent except errors
    # -p0 == needed to find the proper folder
    
  3. À ce stade, le dossier orig/contient le nouveau/contenu, mais a toujours son ancien nom, donc:

    mv orig/ new/    # if the folder names are different
    
119
David H

Découvrez la bibliothèque open source Scarab C++: https://github.com/loyso/Scarab

Il fait exactement ce que vous avez décrit. Il construit un diff par fichier en utilisant la bibliothèque xdelta et le place dans un paquet d'archivage. Vous pouvez redistribuer ce package et appliquer la différence. Il existe des fichiers binaires pour Win32.

Je suis l'auteur du projet Scarab.

1
Alexey Baskakov

Je devais créer un fichier de correctif et l'envoyer à quelqu'un afin qu'il puisse mettre à jour son répertoire pour qu'il corresponde au mien. Cependant, il y a beaucoup de mises en garde avec diff et patch , alors il m'a fallu des heures pour comprendre quelque chose d'aussi simple d'un point de vue conceptuel. Les chemins absolus semblent être préférés aux chemins relatifs, et de nombreuses options semblent avoir évolué à partir de cas d'utilisation de niche. J'ai finalement trouvé une solution basée sur réponse de David H , avec des conseils supplémentaires provenant de Lakshmanan Ganapathy ):

  • Sauvegardez votre directory sur directory.orig
  • Modifiez votre directory pour atteindre l'état souhaité
  • Enregistrer diff de directory.orig à directory dans file.patch donc le nom correspond au destinataire

Voici mes notes:

# 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.
1
Zack Morris