Можно ли сказать 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потому, что длинное имя частично защищает от случайного запуска, поскольку оно может удалить файлы, которые вам все еще нужны. Честно говоря, однако, я обычно запускаю его, набирая cleanTabEnter, что достаточно для того, чтобы найти этот скрипт в PATHмоих машинах разработки.
Дополнительные шаблоны, которые он проверяет, относятся к файлам, выводимым моей выбранной системой контроля версий, когда он сталкивается с той же проблемой во время операции слияния. Вы можете настроить его для своих инструментов VCS / SCM .
Чтобы указать патчу не создавать резервные копии, просто опустите опции -bи любые другие --backup-....
Чтобы не создавать .rejфайлы, добавьте -r -опцию в команду.
GNU patch 2.6Mac, возможно попробуйте-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."