修补时,参数-p0和-p1有什么区别?


19

patch -p0和之间有什么区别patch -p1

有什么区别吗?

Answers:


23

创建补丁程序的最常见方法是运行diff命令或某些版本控制的内置diff-like命令。有时,您只是比较两个文件,并且运行diff如下:

diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch

然后,您将获得一个修补程序,其中包含对一个文件的更改,而根本不包含文件名。应用该修补程序时,需要指定要将其应用到的文件:

patch <alice_to_bob.patch version2_by_alice.txt

通常,您正在比较目录中包含的整个多文件项目的两个版本。典型的diff外观如下所示:

diff -ru old_version new_version >some.patch

然后,补丁程序包含文件名,如标题行所示diff -ru old_version/dir/file new_version/dir/file。您需要告诉您从文件名中patch删除前缀(old_versionnew_version)。那是什么-p1意思:剥去一级目录。

有时,补丁程序中的标题行直接包含文件名,而没有引导。这在版本控制系统中很常见;例如cvs diff产生看起来像的标题行diff -r1.42 foo。然后没有要删除的前缀,因此必须指定-p0

在特殊情况下,要比较的树中没有子目录时,则不需要任何-p选项:patch将丢弃文件名的所有目录部分。但是大多数时候,您确实需要-p0-p1,具体取决于补丁的产生方式。


这么长时间让我感到困惑。为什么没有子目录的行为与-p0不同?我一直以-p0为默认值,因此如果它应该是p0,我总是会遇到问题
Brydon Gibson

@BrydonGibson我怀疑最初的想法是补丁作者可以冷漠地编写diff old/foo new/foo >my.patchdiff ../old/foo foo >my.patchdiff foo.old foo >my.patch,并且用户可以应用它patch <my.patch而不必关心补丁的产生方式,然后-p添加它是为了方便。但是我实际上并不知道它patch是一个旧的实用程序,并且在我开始使用它时-p0或者-p1已经是使用它的最常用方法。
吉尔(Gilles)“所以,别再作恶了”

16

从男人那里:

-pnum--strip=num 从修补程序文件中找到的每个文件名中删除包含num个前导斜杠的最小前缀。一个或多个相邻斜杠的序列计为单个斜杠。如果您将文件保存在与发送补丁程序的人不同的目录中,这将控制如何处理在补丁程序文件中找到的文件名。 例如,假设补丁文件中的文件名为:

 /u/howard/src/blurfl/blurfl.c

设置-p0给出整个文件名未修改-p1给出

 u/howard/src/blurfl/blurfl.c

没有前导斜线-p4给出

 blurfl/blurfl.c

4

区别在于后面的数字-p将指定要删除的路径组件的数目。

说我们有一条路/Barack/Obama。它执行补丁与-p0参数将把路径的是

/Barack/Obama

但是我们可以在打补丁时修剪路径:

-p1将删除根斜杠(请注意,现在只是Barack,不留斜杠):

Barack/Obama

-p2 将删除Barack(和相邻的右斜杠):

 Obama

要扩展此patch行为的“原因” ,请阅读此线程

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.