objectif
Générer un patch unifié entre deux versions (fichier ou dossier) et l’appliquer en toute sécurité, avec dry-run et gestion des chemins.
code minimal
# créer un patch unifié (gère fichiers ajoutés/supprimés)
diff -ruN ./ancien ./nouveau > changes.patch
# appliquer le patch depuis le dossier cible
cd ./ancien
patch -p1 < ../changes.patch
utilisation
# patch pour un seul fichier
diff -u config.old config.new > config.patch
patch -p0 < config.patch
# prévisualiser l'application (dry-run)
patch --dry-run -p1 < changes.patch
# exclure certains motifs (ex: node_modules, fichiers minifiés)
diff -ruN --exclude='node_modules' --exclude='*.min.js' ./ancien ./nouveau > web.patch
# inverser un patch (rollback)
patch -R -p1 < changes.patch
# créer un patch depuis un dépôt git (worktree vs index)
git diff > worktree.patch # modifications non indexées
git diff --cached > staged.patch # modifications indexées
# vérifier et appliquer avec git (meilleure intégration)
git apply --check worktree.patch && git apply worktree.patch
# patchs email (série de commits) puis application
git format-patch -1 HEAD # produit 0001-*.patch
git am 0001-*.patch # applique en créant un commit
variante(s) utile(s)
# générer un patch en ignorant les espaces (attention: peut masquer des soucis)
diff -ruN -w ./ancien ./nouveau > changes.patch
# limiter la profondeur et cibler des extensions spécifiques
diff -ruN --include='*.{py,sh}' ./ancien ./nouveau > code.patch
# coloriser la lecture du patch (GNU diffutils)
diff --color=always -u config.old config.new | less -R
# sauvegarder des rejets et backups lors de l'application
patch --backup --reject-file=- -p1 < changes.patch # rejets sur stdout
notes
-rrecurse,-uformat unifié lisible,-Ntraite les fichiers absents comme vides (ajouts/suppressions).- le niveau
-plors de l’application retire des segments de chemin:-p0garde tout,-p1retire le premier segment. - générez et appliquez les patchs depuis des racines cohérentes pour éviter des erreurs de chemin.
- utilisez
--dry-runavant toute application réelle; en cas d’échec,patchpeut produire des.rej. - sur macOS (BSD diff),
--colorpeut être indisponible; gardez-upour la portabilité.