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_version
或new_version
)。这-p1
就是:剥离一级目录。
有时,补丁中的标题行直接包含文件名而没有前导。这在版本控制系统中很常见;例如cvs diff
产生看起来像的标题行diff -r1.42 foo
。那么就没有要剥离的前缀,因此您必须指定-p0
.
在您比较的树中没有子目录的特殊情况下,不需要任何-p
选项:patch
将丢弃文件名的所有目录部分。但大多数情况下,您确实需要-p0
或-p1
,具体取决于补丁的制作方式。
Sté*_*nez 16
来自男人:
-pnum
或--strip=num
从补丁文件中找到的每个文件名中去除包含 num 个前导斜杠的最小前缀。一个或多个相邻斜线的序列算作一个单斜线。这控制如何处理补丁文件中找到的文件名,以防您将文件保存在与发送补丁的人不同的目录中。 例如,假设补丁文件中的文件名是:Run Code Online (Sandbox Code Playgroud)/u/howard/src/blurfl/blurfl.c
设置
-p0
使整个文件名未修改,-p1
给出Run Code Online (Sandbox Code Playgroud)u/howard/src/blurfl/blurfl.c
没有前导斜杠,
-p4
给出Run Code Online (Sandbox Code Playgroud)blurfl/blurfl.c
小智 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
行为的“原因” ,请阅读此线程。