Запуск "патча" без генерації файлів * .orig та * .rej


20

Чи можна сказати patchне генерувати .origта .rejфайли? Мені дуже прикро, що патч створює це.

Відповіді:


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
Стюарт Cardall

3

Ця --no-backup-if-mismatchопція дозволить уникнути файлів ".orig".

Ви також можете спробувати --mergeваріант, який створює конфлікт у файлі.

У всіх випадках у вас повинен бути якийсь спосіб швидко повернутися до хорошого стану, якщо злиття стане непосильним.


1

Я застряг у патчі v2.5.4, де -r -він змушує створювати відхилені файли з назвою -.

Я виявив, що --reject-file=тобто порожнє значення викликає збій патча з кодом виходу, 2 якщо він намагається написати файл відхилення. Якщо відхилень немає, воно працює як очікувалося. Хоча це не повне рішення для старшої версії патча, за деяких обставин це може бути прийнятним або бажаним.


0

Найкраще, що я міг придумати (правда, спосіб підмітати бруд під килим) -r <tmpfile>, тобто:

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

оскільки в v2.5.8 -r -фактично створюється -файл.


-3

патч -p1 -B / dev / null -r - <file.patch


-1: Це дуже погана порада. По-перше, -Bпрапор не надсилає *.origвихід /dev/null, як це здається з вашої команди. Просто буває так, що звичайні користувачі не можуть записувати у файли, що називаються такими, як /dev/nullfoo.cpp. Якщо ви зробите це як корінь, /devнатомість ви отримаєте барахло у вашому дереві. По-друге, -r -не пригнічує *.rejфайл. Це здається, що це робиться, тому що помилка через хибний -Bпрапор перешкоджає показувати вам, що б це насправді було б зробити без -B, тобто створити файл, який називається -у поточному каталозі.
Воррен Янг

1
@WarrenYoung відповідно до man patch: "-r Поміщає відхилення у файл відхилення замість файлу .rej за замовчуванням. Коли rejectfile - -, відкидає відхилення."
Лімбо Пен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.