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

chr*_*lee 22 patch

patch -p0和 和有patch -p1什么区别?

有什么区别吗?

Gil*_*il' 27

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

diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch
Run Code Online (Sandbox Code Playgroud)

然后你会得到一个补丁,其中包含对一个文件的更改,但根本不包含文件名。当您应用该补丁时,您需要指定要将其应用到哪个文件:

patch <alice_to_bob.patch version2_by_alice.txt
Run Code Online (Sandbox Code Playgroud)

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

diff -ru old_version new_version >some.patch
Run Code Online (Sandbox Code Playgroud)

然后补丁包含文件名,在标题行中给出,如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 我总是遇到问题 (2认同)

Sté*_*nez 16

来自男人:

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

 /u/howard/src/blurfl/blurfl.c
Run Code Online (Sandbox Code Playgroud)

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

 u/howard/src/blurfl/blurfl.c
Run Code Online (Sandbox Code Playgroud)

没有前导斜杠-p4给出

 blurfl/blurfl.c
Run Code Online (Sandbox Code Playgroud)


小智 5

不同之处在于后面的数字-p将指定将被删除的路径组件的数量。

假设我们有一个路径/Barack/Obama。使用-p0参数在其上执行补丁将按原样处理路径:

/Barack/Obama
Run Code Online (Sandbox Code Playgroud)

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

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

Barack/Obama
Run Code Online (Sandbox Code Playgroud)

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

 Obama
Run Code Online (Sandbox Code Playgroud)

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