Risposte:
Il modo più comune per creare una patch è eseguire il diff
comando o il comando incorporato diff
simile a qualche controllo di versione . A volte, stai solo confrontando due file e corri in diff
questo 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 diff
assomiglia 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 patch
di eliminare il prefisso ( old_version
o new_version
) dal nome del file. Questo è ciò che -p1
significa: 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 diff
produce 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: patch
eliminerà tutta la parte della directory dei nomi dei file. Ma il più delle volte, hai bisogno di uno -p0
o -p1
, a seconda di come è stata prodotta la patch.
diff old/foo new/foo >my.patch
o diff ../old/foo foo >my.patch
o diff foo.old foo >my.patch
e che l'utente potesse applicarla patch <my.patch
senza preoccuparsi del modo in cui la patch veniva prodotta e quindi -p
aggiunta per comodità. Ma in realtà non lo so, patch
è una vecchia utility e quando ho iniziato a usarla -p0
o -p1
erano già i modi più comuni per usarla.
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
-p0
dà l'intero nome del file non modificato ,-p1
dàu/howard/src/blurfl/blurfl.c
senza la barra iniziale ,
-p4
dàblurfl/blurfl.c
La differenza è che il numero dopo -p
specifica 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' -p0
argomento tratterà il percorso così com'è :
/Barack/Obama
Ma possiamo tagliare il percorso durante l'applicazione di patch:
-p1
rimuoverà 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 patch
comportamento, leggi questa discussione .