Respuestas:
La forma más común de crear un parche es ejecutar el diffcomando o el comando incorporado de algún control de versión diff. A veces, solo estás comparando dos archivos, y corres diffasí:
diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch
Luego obtienes un parche que contiene cambios para un archivo y no contiene ningún nombre de archivo. Cuando aplique ese parche, debe especificar a qué archivo desea aplicarlo:
patch <alice_to_bob.patch version2_by_alice.txt
A menudo, está comparando dos versiones de un proyecto completo de varios archivos contenido en un directorio. Una invocación típica de se diffve así:
diff -ru old_version new_version >some.patch
Luego, el parche contiene nombres de archivo, dados en líneas de encabezado como diff -ru old_version/dir/file new_version/dir/file. Debe indicar patchque elimine el prefijo ( old_versiono new_version) del nombre del archivo. Eso es lo que -p1significa: eliminar un nivel de directorio.
A veces, las líneas de encabezado en el parche contienen el nombre del archivo directamente sin ningún encabezado. Esto es común con los sistemas de control de versiones; por ejemplo cvs diffproduce líneas de encabezado que se parecen diff -r1.42 foo. Entonces no hay prefijo para eliminar, por lo que debe especificar -p0.
En el caso especial cuando no hay subdirectorios en los árboles que está comparando, no -pes necesaria ninguna opción: patchdescartará toda la parte del directorio de los nombres de archivo. Pero la mayoría de las veces, necesita uno -p0o -p1, dependiendo de cómo se produjo el parche.
diff old/foo new/foo >my.patcho diff ../old/foo foo >my.patcho diff foo.old foo >my.patchy el usuario podía aplicarlo patch <my.patchsin tener que preocuparse por cómo se produjo el parche, y luego -pse agregó como una conveniencia. Pero en realidad no sé, patches una utilidad antigua y para cuando comencé a usarla -p0o -p1ya eran las formas más comunes de usarla.
Del hombre:
-pnumo--strip=numDespoje el prefijo más pequeño que contenga las barras inclinadas numéricas de cada nombre de archivo encontrado en el archivo de revisión. Una secuencia de una o más barras adyacentes se cuenta como una barra simple. Esto controla cómo se tratan los nombres de archivo encontrados en el archivo de parche, en caso de que mantenga sus archivos en un directorio diferente al de la persona que envió el parche. Por ejemplo, suponiendo que el nombre del archivo en el archivo de parche fuera:/u/howard/src/blurfl/blurfl.cla configuración
-p0da el nombre completo del archivo sin modificar ,-p1dau/howard/src/blurfl/blurfl.csin la barra inclinada ,
-p4dablurfl/blurfl.c
La diferencia es que el número posterior -pespecificaría el número de componentes de ruta que se eliminarían.
Digamos que tenemos un camino /Barack/Obama. Ejecutar un parche con el -p0argumento tratará la ruta como es :
/Barack/Obama
Pero podemos recortar el camino mientras parcheamos:
-p1eliminará la barra diagonal (tenga en cuenta que ahora será Barack, sin una barra):
Barack/Obama
-p2 eliminará Barack (y la barra diagonal derecha adyacente):
Obama
Para ampliar el "por qué" de este patchcomportamiento, lea este hilo .