Ausführen von "Patch", ohne * .orig- und * .rej-Dateien zu generieren

20

Kann man sagen, patchnicht zu generieren .origund .rejDateien? Ich finde es extrem ärgerlich, dass Patch diese erstellt.

Das Fahrgestell
quelle

Antworten:

14

Wenn Sie keine patchandere Option als -pNangeben, werden diese Dateien nur erstellt, wenn ein Patch nicht ordnungsgemäß angewendet werden kann.

Daher besteht eine Möglichkeit darin, das Erstellen (oder Akzeptieren) fehlerhafter Patches zu beenden. :)

Zurück in der realen Welt ist dies ein Feature. Wenn patch(1)ein Patch-Segment nicht auf die Originaldatei angewendet werden kann, wird die temporäre Kopie der Originaldatei dauerhaft gespeichert , und *.origdas zurückgewiesene Segment wird abgelegt *.rej, und es wird weiterhin versucht, Patch-Segmente anzuwenden. Die Idee ist, dass Sie die *.rejDatei öffnen und den Patch-Vorgang manuell abschließen können, indem Sie Teile in die gepatchte Datei kopieren. Die *.origDatei kann auch nützlich sein, wenn der Patch-Prozess versehentlich einen Fehler verursacht und Sie sich auf die Originalversion beziehen müssen, um ihn zu beheben.

Ich behebe nicht immer einen fehlerhaften Patch mit Text aus den Dateien *.rejund *.orig, aber es ist schön, sie zu haben, falls ich sie brauche.

Sobald ich einen fehlerhaften Patch repariert habe, führe ich das folgende Skript im Projektstamm aus, um schnell aufzuräumen:

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

Ich nenne es, cleanup-after-bad-patchweil der lange Name teilweise gegen versehentliches Ausführen versichert, da er Dateien entfernen kann, die Sie noch benötigen. Um ehrlich zu sein, starte ich es normalerweise mit der Eingabe cleanTabEnter, was ausreicht, um dieses Skript PATHauf meinen Entwicklungsmaschinen zu finden .

Die zusätzlichen Muster, nach denen gesucht wird, beziehen sich auf die Dateien, die von meinem Versionskontrollsystem der Wahl ausgegeben werden, wenn bei einem Zusammenführungsvorgang dasselbe Problem auftritt. Möglicherweise möchten Sie es für Ihre VCS / SCM- Tools anpassen .

Warren Young
quelle
7

Wenn Sie dem Patch mitteilen möchten, dass keine Backups erstellt werden sollen, lassen Sie die Optionen -bund --backup-...weg.

Um es anzuweisen, keine .rejDateien zu erstellen , fügen Sie -r -dem Befehl eine Option hinzu.

Serge
quelle
4
Das funktioniert bei mir nicht - es fügt die Ablehnungen einfach in eine Datei mit dem Namen "-" ein. Dies ist ein sehr, sehr ärgerlicher Dateiname. Ich verwende Version 2.5.8 auf einem Mac.
rjmunro
Arbeits ok auf GNU patch 2.6vielleicht auf mac versuchen-r /dev/null
Stuart Cardall
3

Die --no-backup-if-mismatchOption vermeidet die ".orig" -Dateien.

Möglicherweise möchten Sie auch die --mergeOption ausprobieren , die einen Konflikt in der Datei verursacht.

In jedem Fall sollten Sie eine Möglichkeit haben, schnell in einen guten Zustand zurückzukehren, wenn die Zusammenführung überwältigend wird.

Cody Allan Taylor
quelle
1

Ich bin mit Patch v2.5.4 festgefahren, wo -r -es dazu führt, dass Ablehnungsdateien mit dem Namen erstellt werden -.

Ich fand , dass das --reject-file=heißt leerer Wert Patch mit Exit - Code zum Scheitern verurteilt 2 IF es sich um eine Datei ablehnen zu schreiben versucht. Wenn es keine Ausschüsse gibt, funktioniert es wie erwartet. Obwohl dies keine vollständige Lösung für ältere Patch-Versionen ist, kann dies unter bestimmten Umständen akzeptabel oder erwünscht sein.

AnyDev
quelle
0

Das Beste, was ich mir einfallen lassen kann (zugegebenermaßen eine Möglichkeit, den Schmutz unter den Teppich zu kehren), ist die Verwendung von -r <tmpfile>:

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

Seit v2.5.8 -r -wird die -Datei tatsächlich erstellt .

PJ_Finnegan
quelle
-3

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

Max
quelle
-1: Das ist ein sehr schlechter Rat. Erstens -Bsendet das Flag die *.origAusgabe nicht an /dev/null, wie es von Ihrem Befehl angezeigt wird. Es kommt einfach vor, dass normale Benutzer nicht in Dateien wie schreiben können /dev/nullfoo.cpp. Wenn Sie dies als root tun, werden Sie /devstattdessen Müll in Ihrem Baum bekommen. Zweitens wird -r -die *.rejDatei nicht unterdrückt . Das scheint nur so zu sein, weil der Fehler aufgrund des falschen -BFlags verhindert, dass es Ihnen anzeigt, was es ohne das wirklich tun würde -B, das eine Datei erstellt, die -im aktuellen Verzeichnis aufgerufen wird .
Warren Young
1
@WarrenYoung laut man patch: "-r Zurückweisungen in Zurückweisungsdatei anstelle der Standard-.rej-Datei einfügen. Wenn rejectfile - ist, Zurückweisungen verwerfen."
Limbo Peng