Al parchear, ¿cuál es la diferencia entre los argumentos -p0 y -p1?

19

¿Cuál es la diferencia entre patch -p0y patch -p1?

¿Hay alguna diferencia en absoluto?

chrisjlee
fuente

Respuestas:

23

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.

Gilles 'SO- deja de ser malvado'
fuente
Esto me ha confundido por tanto tiempo. ¿Por qué el comportamiento de ningún subdirectorio es diferente de -p0? Siempre asumí que -p0 era el valor predeterminado, por lo que siempre tuve problemas si se suponía que era p0
Brydon Gibson
@BrydonGibson Sospecho que originalmente la idea era que el autor del parche podía escribir indistintamente 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.
Gilles 'SO- deja de ser malvado'
16

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 -p0da el nombre completo del archivo sin modificar , -p1da

 u/howard/src/blurfl/blurfl.c

sin la barra inclinada , -p4da

 blurfl/blurfl.c
Stéphane Gimenez
fuente
4

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 .

JohnDoea
fuente