Как я могу применить патч -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использовать абсолютный путь с любым рабочим каталогом?

Sparhawk
источник
Вместо этого я бы отредактировал сам патч.
Braiam
@Braiam Какие конкретные изменения я бы внес в патч? Мне в основном интересно, могу ли я избежать указания целевых путей в patchкоманде.
Sparhawk
Некоторый контекст, пожалуйста. Вы пытаетесь применить этот патч к работающей системе? Если так, то почему? Какой у вас дистрибутив / ОС? Что делает этот патч? Это похоже на патч для KDE. Какой компонент? В целом, если ваш дистрибутив не применяет патч для вас, вам следует пересобрать соответствующий пакет из исходного кода с примененным патчем. И вы можете обрезать ведущую часть пути. Это не должно быть проблемой. Сколько вы обрезаете, зависит от того, как выглядит источник.
Фахим Митха
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 я пропустил этот комментарий в то время. Вы должны написать это в качестве ответа.
Sparhawk