如何从任何工作目录中应用-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 2014年

@Braiam我将对补丁进行哪些具体编辑?我基本上想知道是否可以避免在patch命令中指定任何目标路径。
Sparhawk

请提供一些背景信息。您是否正在尝试将此补丁应用于正在运行的系统?如果是这样,为什么?您的发行版/操作系统是什么?该补丁有什么作用?它看起来像是KDE的补丁。什么成分?通常,如果您的发行版没有为您应用补丁程序,则应从应用了补丁程序的源代码中重建相关的软件包。您可以修剪路径的前导部分。那不应该是问题。修剪多少取决于光源的外观。
Faheem Mitha 2014年

1
@FaheemMitha是的,它正在与Arch / KDE一起运行。是要修复此错误。如果我手动应用更改,此修复程序将起作用。但是,在这种情况下,上下文并不重要,因为我可以使用中的测试文件来复制此问题/tmp/foo。我对适用于的通用答案更感兴趣patch
Sparhawk

Answers:


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对不起,我的描述部分不正确。测试是:如果当前目录不是/,则拒绝任何绝对路径或包含..组件的路径。
吉尔斯(Gilles)'所以

7
或者更简单地说,sudo patch -d/ -p0 <foo.patch
钱其谦(Qian

@TheoYou我当时错过了那条评论。您应该将其写下来作为答案。
Sparhawk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.