Відповіді:
Якщо ви не надаєте жодної опції, 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 -
фактично створюється -
файл.
патч -p1 -B / dev / null -r - <file.patch
-B
прапор не надсилає *.orig
вихід /dev/null
, як це здається з вашої команди. Просто буває так, що звичайні користувачі не можуть записувати у файли, що називаються такими, як /dev/nullfoo.cpp
. Якщо ви зробите це як корінь, /dev
натомість ви отримаєте барахло у вашому дереві. По-друге, -r -
не пригнічує *.rej
файл. Це здається, що це робиться, тому що помилка через хибний -B
прапор перешкоджає показувати вам, що б це насправді було б зробити без -B
, тобто створити файл, який називається -
у поточному каталозі.
man patch
: "-r Поміщає відхилення у файл відхилення замість файлу .rej за замовчуванням. Коли rejectfile - -, відкидає відхилення."