据我所知,patch
当某些路径组件被删除时,允许修补应用程序。
虽然-p0
参数将处理路径按原样:
/var/www/html/example.com
-p1
将删除根斜杠,因此我们使用的路径将变为:
var/www/html/example.com
为什么要删除根斜线(或路径的任何先前组成部分),而不只是使用完整路径进行修补?
我可以看到通过相对路径加深目录树的逻辑,但我想念它在绝大多数情况下是否实用或有用。
答案1
这patch
是一个 POSIX 实用程序,实用程序标准规范中的基本原理部分给出了该选项的使用示例-p
:
该
-p
选项使得可以将补丁文件自定义为本地用户目录结构,而无需手动编辑补丁文件。例如,如果补丁文件中的文件名是:/curds/whey/src/blurfl/blurfl.c
设置
-p 0
给出未修改的整个路径名;-p 1
给出:curds/whey/src/blurfl/blurfl.c
没有前导
<slash>
,-p 4
给出:blurfl/blurfl.c
并且根本不指定 -p 给出:
blurfl.c
这OpenBSD 手册还有一个类似但稍微扩展的示例,说明何时使用-p
可能有用(我的重点):
-p strip-count
,--strip strip-count
设置路径名条数,它控制如何处理补丁文件中找到的路径名,如果您将文件保存在与发送补丁的人不同的目录中。删除计数指定要从路径名前面删除多少个斜杠。 (任何介入的目录名称也会消失。)例如,假设补丁文件中的文件名是
/u/howard/src/blurfl/blurfl.c
:设置
-p0
给出了未修改的整个路径名。
-p1
给出u/howard/src/blurfl/blurfl.c
没有前导斜杠。
-p4
给出blurfl/blurfl.c
它接着说:
-p
根本不指定只会给您blurfl.c
,除非前导路径 ( ) 中的所有目录u/howard/src/blurfl
都存在并且该路径是相对的,在这种情况下您将获得未修改的整个路径名。无论您最终得到什么,都会在当前目录或选项指定的目录中查找-d
。
也就是说,如果您获得的补丁包含其所应用的文件的绝对路径,并且您将这些文件保存在不同的目录中,那么您可以使用-p
适当的数字来“偏移”补丁中的路径由-d
(或当前目录)指定的目录。
答案2
这修补命令读取源文件中有关如何更改文件的说明,然后应用更改(例如更多细节)。并且路过-pN标志跳过氮补丁文件中存在的文件名的前导斜杠。
这是关于目录部分差异标头。在您的情况下,差异标头包含此字符串:/var/www/html/example.com
。如果您使用 -p1 标志,补丁实用程序将从该字符串前导目录中剥离,您将得到一个var/www/html/example.com
您想要补丁的 。使用 -p0 参数将修补不会从该字符串中删除任何内容,并且它将无法正常工作。
例如 :
为了正确调用 SSH2.xs 文件修补(修补程序文件位于此处:rt.cpan.org/Public/Bug/Display.html?id=36614):
patch -p1 < net-ssh2-0.18-perl5.10.patch
补丁文件包含您在打补丁之前删除的目录Net-SSH-0.18.orig
,并且上面的内容必须从 SSH2.x2 文件所在的目录执行。