Kann man sagen, patch
nicht zu generieren .orig
und .rej
Dateien? Ich finde es extrem ärgerlich, dass Patch diese erstellt.
Kann man sagen, patch
nicht zu generieren .orig
und .rej
Dateien? Ich finde es extrem ärgerlich, dass Patch diese erstellt.
Antworten:
Wenn Sie keine patch
andere Option als -pN
angeben, 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 *.orig
das zurückgewiesene Segment wird abgelegt *.rej
, und es wird weiterhin versucht, Patch-Segmente anzuwenden. Die Idee ist, dass Sie die *.rej
Datei öffnen und den Patch-Vorgang manuell abschließen können, indem Sie Teile in die gepatchte Datei kopieren. Die *.orig
Datei 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 *.rej
und *.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-patch
weil 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 clean
TabEnter, was ausreicht, um dieses Skript PATH
auf 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 .
Wenn Sie dem Patch mitteilen möchten, dass keine Backups erstellt werden sollen, lassen Sie die Optionen -b
und --backup-...
weg.
Um es anzuweisen, keine .rej
Dateien zu erstellen , fügen Sie -r -
dem Befehl eine Option hinzu.
GNU patch 2.6
vielleicht auf mac versuchen-r /dev/null
Die --no-backup-if-mismatch
Option vermeidet die ".orig" -Dateien.
Möglicherweise möchten Sie auch die --merge
Option 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.
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.
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 .
patch -p1 -B / dev / null -r - <file.patch
-B
sendet das Flag die *.orig
Ausgabe 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 /dev
stattdessen Müll in Ihrem Baum bekommen. Zweitens wird -r -
die *.rej
Datei nicht unterdrückt . Das scheint nur so zu sein, weil der Fehler aufgrund des falschen -B
Flags verhindert, dass es Ihnen anzeigt, was es ohne das wirklich tun würde -B
, das eine Datei erstellt, die -
im aktuellen Verzeichnis aufgerufen wird .
man patch
: "-r Zurückweisungen in Zurückweisungsdatei anstelle der Standard-.rej-Datei einfügen. Wenn rejectfile - ist, Zurückweisungen verwerfen."