Risposte:
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.
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.
Dall'uomo:
-pnumoppure--strip=numSpoglia 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.cimpostazione
-p0dà l'intero nome del file non modificato ,-p1dàu/howard/src/blurfl/blurfl.csenza la barra iniziale ,
-p4dàblurfl/blurfl.c
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 .