Як я можу застосувати патч -p0 з будь-якого робочого каталогу?


26

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

--- /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml  2014-10-10 18:47:23.000000000 +1100
+++ /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod  2014-11-11 09:44:17.786200477 +1100

Однак він не вдається, якщо я не перебуваю в кореневому каталозі.

~$ cd
~$ sudo patch -i /tmp/fix_kde_icons.patch -p0
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
...
~$ cd /tmp
/tmp$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/tmp$ cd /usr
/usr$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/usr$ cd /
/$ sudo patch -i /tmp/fix_kde_icons.patch -p0
patching file /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml

Чи є спосіб patchвикористовувати абсолютний шлях з будь-яким робочим каталогом?


Я б змінив сам патч.
Брайам

@Braiam Які конкретні зміни я б внесла до патчу? Мені в основному цікаво, чи можу я уникнути необхідності вказувати будь-які цільові шляхи в patchкоманді.
Sparhawk

Будь-який контекст, будь ласка. Ви намагаєтесь застосувати цей патч до запущеної системи? Якщо так, то чому? Який розподіл / ОС? Що робить цей пластир? Це схоже на виправлення для KDE. Який компонент? Загалом, якщо ваш дистрибутив не застосовує для вас патч, вам слід відновити відповідний пакет із джерела із застосованим патчем. І ви можете обрізати провідну частину шляху. Це не повинно бути проблемою. Скільки ви обрізаєте, залежить від того, як виглядає джерело.
Faheem Mitha

1
@FaheemMitha Так, працює з Arch / KDE. Це виправити цю помилку . Виправлення працює, якщо я вручну застосую зміни. Однак я не думаю, що в цьому випадку контекст має велике значення, тому що я можу повторити цю проблему з тестовим файлом в /tmp/foo. Мене більше цікавить загальна відповідь, яка стосується patch.
Sparhawk

Відповіді:


35

Дивлячись на вихідний код патча GNU, така поведінка вбудована з версії 2.7. Станом на патч GNU 2.7.1, ..приймаються лише відносні шляхи, що не містять , якщо тільки поточний каталог не є кореневою каталогом.

Щоб застосувати виправлення, що містить абсолютні шляхи, ви можете використовувати

(cd / && sudo patch -p0) <foo.patch

В останніх версіях патчу GNU ви можете просто

sudo patch -d/ -p0 <foo.patch

Гаразд, це те, що воно є. Однак якщо ви перевірите мої команди, cd /usrтакож не вдалося, незважаючи на те, що цільові файли знаходяться під цим каталогом.
Sparhawk

@Sparhawk Вибачте, мій опис був частково невірним. Тест такий: якщо поточного каталогу немає /, то відхиліть будь-який абсолютний шлях або шлях, що містить ..компонент.
Жил 'ТАК - перестань бути злим'

7
Або, простіше кажучи,sudo patch -d/ -p0 <foo.patch
Цянь

@TheoYou я пропустив цей коментар у той час. Ви повинні записати це як відповідь.
Спархаук
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.