Quando correggi qual è la differenza tra gli argomenti -p0 e -p1?


19

Qual è la differenza tra patch -p0e patch -p1?

C'è qualche differenza?

Risposte:


23

Il modo più comune per creare una patch è eseguire il diffcomando o il comando incorporato diffsimile a qualche controllo di versione . A volte, stai solo confrontando due file e corri in diffquesto modo:

diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch

Quindi ottieni una patch che contiene le modifiche per un file e non contiene affatto un nome di file. Quando si applica quella patch, è necessario specificare a quale file si desidera applicarlo:

patch <alice_to_bob.patch version2_by_alice.txt

Spesso si confrontano due versioni di un intero progetto multi-file contenuto in una directory. Un'invocazione tipica di diffassomiglia a questo:

diff -ru old_version new_version >some.patch

Quindi la patch contiene nomi di file, indicati in righe di intestazione come diff -ru old_version/dir/file new_version/dir/file. Devi dire patchdi eliminare il prefisso ( old_versiono new_version) dal nome del file. Questo è ciò che -p1significa: eliminare un livello di directory.

A volte, le righe di intestazione nella patch contengono direttamente il nome del file senza lead-up. Questo è comune con i sistemi di controllo della versione; ad esempio cvs diffproduce righe di intestazione che sembrano diff -r1.42 foo. Quindi non c'è un prefisso da rimuovere, quindi è necessario specificare -p0.

Nel caso speciale in cui non ci sono sottodirectory negli alberi che si stanno confrontando, non -pè necessaria alcuna opzione: patcheliminerà tutta la parte della directory dei nomi dei file. Ma il più delle volte, hai bisogno di uno -p0o -p1, a seconda di come è stata prodotta la patch.


Questo mi ha confuso per così tanto tempo. Perché il comportamento di nessuna sottodirectory è diverso da -p0? Ho sempre pensato che -p0 era predefinito, quindi ho sempre avuto problemi se doveva essere p0
Brydon Gibson,

@BrydonGibson Ho il sospetto che in origine l'idea fosse che l'autore della patch potesse scrivere indifferentemente diff old/foo new/foo >my.patcho diff ../old/foo foo >my.patcho diff foo.old foo >my.patche che l'utente potesse applicarla patch <my.patchsenza preoccuparsi del modo in cui la patch veniva prodotta e quindi -paggiunta per comodità. Ma in realtà non lo so, patchè una vecchia utility e quando ho iniziato a usarla -p0o -p1erano già i modi più comuni per usarla.
Gilles 'SO- smetti di essere malvagio' il

16

Dall'uomo:

-pnum oppure --strip=num Spoglia il prefisso più piccolo contenente il numero di barre iniziali da ciascun nome di file trovato nel file patch. Una sequenza di una o più barre adiacenti viene conteggiata come una barra singola. Questo controlla il modo in cui vengono trattati i nomi dei file trovati nel file patch, nel caso in cui i file vengano conservati in una directory diversa rispetto alla persona che ha inviato la patch. Ad esempio, supponendo che il nome del file nel file patch fosse:

 /u/howard/src/blurfl/blurfl.c

impostazione -p0dà l'intero nome del file non modificato , -p1

 u/howard/src/blurfl/blurfl.c

senza la barra iniziale , -p4

 blurfl/blurfl.c

4

La differenza è che il numero dopo -pspecifica il numero di componenti del percorso che verrebbero rimossi.

Di 'che abbiamo un percorso /Barack/Obama. L'esecuzione di una patch su di essa con l' -p0argomento tratterà il percorso così com'è :

/Barack/Obama

Ma possiamo tagliare il percorso durante l'applicazione di patch:

-p1rimuoverà la barra ( fai attenzione che ora sarà solo Barack, senza lasciare una barra):

Barack/Obama

-p2 rimuoverà Barack (e la barra destra adiacente):

 Obama

Per espandere il "perché" di questo patchcomportamento, leggi questa discussione .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.