Respuestas:
La forma más común de crear un parche es ejecutar el diff
comando o el comando incorporado de algún control de versión diff
. A veces, solo estás comparando dos archivos, y corres diff
así:
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 diff
ve 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 patch
que elimine el prefijo ( old_version
o new_version
) del nombre del archivo. Eso es lo que -p1
significa: 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 diff
produce 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 -p
es necesaria ninguna opción: patch
descartará toda la parte del directorio de los nombres de archivo. Pero la mayoría de las veces, necesita uno -p0
o -p1
, dependiendo de cómo se produjo el parche.
diff old/foo new/foo >my.patch
o diff ../old/foo foo >my.patch
o diff foo.old foo >my.patch
y el usuario podía aplicarlo patch <my.patch
sin tener que preocuparse por cómo se produjo el parche, y luego -p
se agregó como una conveniencia. Pero en realidad no sé, patch
es una utilidad antigua y para cuando comencé a usarla -p0
o -p1
ya eran las formas más comunes de usarla.
Del hombre:
-pnum
o--strip=num
Despoje 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.c
la configuración
-p0
da el nombre completo del archivo sin modificar ,-p1
dau/howard/src/blurfl/blurfl.c
sin la barra inclinada ,
-p4
dablurfl/blurfl.c
La diferencia es que el número posterior -p
especificaría el número de componentes de ruta que se eliminarían.
Digamos que tenemos un camino /Barack/Obama
. Ejecutar un parche con el -p0
argumento tratará la ruta como es :
/Barack/Obama
Pero podemos recortar el camino mientras parcheamos:
-p1
eliminará 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 patch
comportamiento, lea este hilo .