Запуск «патча» без генерации файлов * .orig и * .rej

20

Можно ли сказать patchне генерировать .origи .rejфайлы? Я нахожу это чрезвычайно раздражающим, что патч создает их.

TheLegassis
источник

Ответы:

14

Если вы не предоставляете никакой опции, patchкроме -pN, он создает эти файлы только тогда, когда исправление не может быть применено корректно.

Таким образом, один из вариантов - прекратить создавать (или принимать) плохие патчи. :)

Вернувшись в реальный мир, это особенность. Когда patch(1)не удается применить сегмент исправления к исходному файлу, он сохраняет на длительное время временную исходную копию файла как *.orig, сбрасывает отклоненный сегмент *.rejи продолжает попытки применить сегменты исправления. Идея состоит в том, что вы можете открыть *.rejфайл и завершить процесс исправления вручную, скопировав фрагменты в исправленный файл. *.origФайл также может быть полезно , когда процесс исправления случайно испортит что - то, и вам необходимо обратиться к оригинальной версии , чтобы исправить это.

Я не всегда исправить плохой патч с текстом из *.rejи *.origфайлов, но приятно иметь их в случае , если они нужны мне.

После того, как я исправил плохой патч, я запускаю следующий скрипт в корне проекта, чтобы быстро все исправить:

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

Я называю это cleanup-after-bad-patchпотому, что длинное имя частично защищает от случайного запуска, поскольку оно может удалить файлы, которые вам все еще нужны. Честно говоря, однако, я обычно запускаю его, набирая cleanTabEnter, что достаточно для того, чтобы найти этот скрипт в PATHмоих машинах разработки.

Дополнительные шаблоны, которые он проверяет, относятся к файлам, выводимым моей выбранной системой контроля версий, когда он сталкивается с той же проблемой во время операции слияния. Вы можете настроить его для своих инструментов VCS / SCM .

Уоррен Янг
источник
7

Чтобы указать патчу не создавать резервные копии, просто опустите опции -bи любые другие --backup-....

Чтобы не создавать .rejфайлы, добавьте -r -опцию в команду.

саржа
источник
4
Это не работает для меня - он просто помещает отклонения в файл с именем "-", который является очень и очень раздражающим именем файла, которое должно быть вокруг. Я использую версию 2.5.8 на Mac.
rjmunro
работает нормально на GNU patch 2.6Mac, возможно попробуйте-r /dev/null
Стюарт Кардалл
3

--no-backup-if-mismatchОпция позволит избежать файлы «.orig».

Вы также можете попробовать --mergeопцию, которая создает конфликт в файле.

Во всех случаях у вас должен быть какой-то способ быстро вернуться в хорошее состояние, если слияние становится чрезмерным.

Коди Аллан Тейлор
источник
1

Я застрял с патчем v2.5.4, где -r -он вызывает создание отклоненных файлов с именем -.

Я обнаружил, что, --reject-file=т. Е. Пустое значение приводит к сбою исправления с кодом 2 завершения, если он пытается записать отклоненный файл. Если нет отклонений, это работает как ожидалось. Хотя это и не полное решение для более старой версии патча, в некоторых случаях это может быть приемлемым или желательным.

AnyDev
источник
0

Лучшее, что я мог придумать (по общему признанию, способ подмести грязь под ковриком), это использование -r <tmpfile>:

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

так как в v2.5.8, -r -фактически создает -файл.

PJ_Finnegan
источник
-3

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

МАКСИМУМ
источник
-1: это очень плохой совет. Во-первых, -Bфлаг не отправляет *.origвывод /dev/null, как это видно из вашей команды. Просто бывает, что обычные пользователи не могут писать в файлы, называемые такими вещами, как /dev/nullfoo.cpp. Если вы сделаете это от имени пользователя root, /devвместо этого вы получите мусор в своем дереве. Во-вторых, -r -не подавляет *.rejфайл. Похоже, он просто делает это, потому что ошибка из-за поддельного -Bфлага не позволяет ему показать, что он на самом деле сделал бы без -B, то есть создать файл с именем -в текущем каталоге.
Уоррен Янг
1
@WarrenYoung в соответствии с man patch: "-r Put отклоняет в rejectfile вместо файла по умолчанию .rej. Когда rejectfile равен -, discard reject."
Лимбо Пенг