Exécution de «patch» sans générer de fichiers * .orig et * .rej

20

Est-il possible de dire de patchne pas générer .origet de .rejfichiers? Je trouve extrêmement ennuyeux que le patch les crée.

TheLegassis
la source

Réponses:

14

Si vous ne donnez aucune option à patchautre que -pN, il ne crée ces fichiers que lorsqu'un correctif ne s'applique pas correctement.

Ainsi, une option consiste à arrêter de créer (ou d'accepter) de mauvais correctifs. :)

De retour dans le monde réel, c'est une fonctionnalité. Lorsque patch(1)ne parvient pas à appliquer un segment de correctif au fichier d'origine, il enregistre durablement la copie du fichier d'origine temporaire sous *.orig, vide le segment rejeté *.rejet continue d'essayer d'appliquer des segments de correctif. L'idée est que vous pouvez ouvrir le *.rejfichier et terminer le processus de patch manuellement en copiant des morceaux dans le fichier patché. Le *.origfichier peut également être utile lorsque le processus de correction détruit accidentellement quelque chose et que vous devez vous référer à la version d'origine pour le réparer.

Je ne corrige pas toujours un mauvais patch avec le texte des fichiers *.rejet *.orig, mais c'est bien de les avoir au cas où j'en aurais besoin.

Une fois que j'ai corrigé un mauvais correctif, j'exécute le script suivant à la racine du projet pour nettoyer rapidement les choses:

#!/bin/bash
find . '(' \
    -name \*-baseline -o \
    -name \*-merge -o \
    -name \*-original -o \
    -name \*.orig -o \
    -name \*.rej \
')' -delete

Je l'appelle cleanup-after-bad-patchparce que le nom long assure partiellement contre l'exécution accidentelle, car il pourrait supprimer les fichiers dont vous avez encore besoin. Pour être honnête, cependant, je l'exécute normalement en tapant cleanTabEnter, cela suffit pour trouver ce script dans PATHsur mes machines de développement.

Les modèles supplémentaires qu'il vérifie concernent les fichiers générés par mon système de contrôle de version de choix lorsqu'il rencontre le même problème lors d'une opération de fusion. Vous pouvez l'ajuster pour vos outils VCS / SCM .

Warren Young
la source
7

Pour dire correctif ne pas produire des sauvegardes omettre seulement les -bet toutes les --backup-...options.

Pour lui demander de ne pas créer de .rejfichiers, ajoutez l' -r -option à la commande.

Serge
la source
4
Cela ne fonctionne pas pour moi - il met simplement les rejets dans un fichier appelé "-", qui est un nom de fichier très très ennuyeux à avoir autour. J'utilise la version 2.5.8 sur un Mac.
rjmunro
travailler ok sur GNU patch 2.6mac peut-être essayer-r /dev/null
Stuart Cardall
3

L' --no-backup-if-mismatchoption évitera les fichiers ".orig".

Vous pouvez également essayer l' --mergeoption, qui crée un conflit dans le fichier.

Dans tous les cas, vous devriez avoir un moyen de revenir rapidement à un bon état si la fusion devient écrasante.

Cody Allan Taylor
la source
1

Je suis bloqué avec le patch v2.5.4 où -r -il crée des fichiers de rejet nommés -.

J'ai trouvé que, par --reject-file=exemple, une valeur vide entraîne l'échec du correctif avec le code de sortie 2 SI il essaie d'écrire un fichier de rejet. S'il n'y a aucun rejet, cela fonctionne comme prévu. Bien qu'il ne s'agisse pas d'une solution complète pour l'ancienne version du correctif, dans certaines circonstances, cela peut être acceptable ou souhaité.

AnyDev
la source
0

Le mieux que j'ai pu trouver (certes un moyen de balayer la saleté sous le tapis) est d'utiliser -r <tmpfile>, à savoir:

# patch -r /tmp/deleteme.rej -i patchfile filetobepatched

car dans la v2.5.8, -r -crée réellement le -fichier.

PJ_Finnegan
la source
-3

patch -p1 -B / dev / null -r - <fichier.patch

MAX
la source
-1: C'est un très mauvais conseil. Tout d'abord, l' -Bindicateur n'envoie pas la *.origsortie à /dev/null, comme il apparaît à partir de votre commande. Il arrive juste que les utilisateurs normaux ne puissent pas écrire dans des fichiers appelés des choses comme /dev/nullfoo.cpp. Si vous le faites en tant que root, vous obtiendrez à la /devplace des ordures dans votre arbre. Deuxièmement, -r -ne supprime pas le *.rejfichier. Cela semble juste le faire parce que l'erreur due au faux -Bdrapeau l'empêche de vous montrer ce qu'il ferait vraiment sans -B, qui est de créer un fichier appelé -dans le répertoire courant.
Warren Young
1
@WarrenYoung selon man patch: "-r Placer les rejets dans le fichier de rejet au lieu du fichier .rej par défaut. Lorsque le fichier de rejet est -, rejeter les rejets."
Limbo Peng