使用“-p1”等删除根斜线

使用“-p1”等删除根斜线

据我所知,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 文件所在的目录执行。

参考 :
1.-p0 与 -p1
2.手册页-IBM

相关内容