Можно ли сказать patch
не генерировать .orig
и .rej
файлы? Я нахожу это чрезвычайно раздражающим, что патч создает их.
Можно ли сказать patch
не генерировать .orig
и .rej
файлы? Я нахожу это чрезвычайно раздражающим, что патч создает их.
Ответы:
Если вы не предоставляете никакой опции, 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
потому, что длинное имя частично защищает от случайного запуска, поскольку оно может удалить файлы, которые вам все еще нужны. Честно говоря, однако, я обычно запускаю его, набирая clean
TabEnter, что достаточно для того, чтобы найти этот скрипт в PATH
моих машинах разработки.
Дополнительные шаблоны, которые он проверяет, относятся к файлам, выводимым моей выбранной системой контроля версий, когда он сталкивается с той же проблемой во время операции слияния. Вы можете настроить его для своих инструментов VCS / SCM .
Чтобы указать патчу не создавать резервные копии, просто опустите опции -b
и любые другие --backup-...
.
Чтобы не создавать .rej
файлы, добавьте -r -
опцию в команду.
GNU patch 2.6
Mac, возможно попробуйте-r /dev/null
--no-backup-if-mismatch
Опция позволит избежать файлы «.orig».
Вы также можете попробовать --merge
опцию, которая создает конфликт в файле.
Во всех случаях у вас должен быть какой-то способ быстро вернуться в хорошее состояние, если слияние становится чрезмерным.
Я застрял с патчем v2.5.4, где -r -
он вызывает создание отклоненных файлов с именем -
.
Я обнаружил, что, --reject-file=
т. Е. Пустое значение приводит к сбою исправления с кодом 2
завершения, если он пытается записать отклоненный файл. Если нет отклонений, это работает как ожидалось. Хотя это и не полное решение для более старой версии патча, в некоторых случаях это может быть приемлемым или желательным.
Лучшее, что я мог придумать (по общему признанию, способ подмести грязь под ковриком), это использование -r <tmpfile>
:
# patch -r /tmp/deleteme.rej -i patchfile filetobepatched
так как в v2.5.8, -r -
фактически создает -
файл.
patch -p1 -B / dev / null -r - <file.patch
-B
флаг не отправляет *.orig
вывод /dev/null
, как это видно из вашей команды. Просто бывает, что обычные пользователи не могут писать в файлы, называемые такими вещами, как /dev/nullfoo.cpp
. Если вы сделаете это от имени пользователя root, /dev
вместо этого вы получите мусор в своем дереве. Во-вторых, -r -
не подавляет *.rej
файл. Похоже, он просто делает это, потому что ошибка из-за поддельного -B
флага не позволяет ему показать, что он на самом деле сделал бы без -B
, то есть создать файл с именем -
в текущем каталоге.
man patch
: "-r Put отклоняет в rejectfile вместо файла по умолчанию .rej. Когда rejectfile равен -, discard reject."