Crea patch o file diff dal repository git e applicalo a un altro repository git diverso


155

Lavoro su un progetto basato su WordPress e voglio patchare il mio progetto ad ogni nuova versione di WP. Per questo, voglio generare una patch tra due commit o tag.

Ad esempio, nel mio repository /www/WPfaccio questo:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

O

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif WordPress

/www/myproject Il mio progetto git basato su WordPress

La git applyriga di comando non funziona, penso perché ci troviamo in diversi repository.

Posso generare un file patch senza commit, solo un differenziale e applicarlo a un altro repository git?

Grazie in anticipo.

Risposte:


243

Puoi semplicemente usare git diffper produrre un diff unificato adatto a git apply:

git diff tag1..tag2 > mypatch.patch

È quindi possibile applicare la patch risultante con:

git apply mypatch.patch

1
Grazie Enrico, ho usato $git diff -u tag1..tag2 > mypatch.patche $git apply --stat > mypatch.patchla risposta è 0 files changedqualche altro suggerimento per favore? :)
Zatamina,

È necessario specificare il percorso del file patch come argomento di git apply. Ho aggiornato la mia risposta con un esempio.
Enrico Campidoglio,

1
Ho usato git diff -p tag1 tag2 > my.patchche ha funzionato bene.
barclay

Come faccio a creare patch in formato diff unificato? sourceware.org/glibc/wiki/… dice Only unified diff (-uNr) format is acceptable.ma quando provo git diff -uNr tag1..tag2 > mypatch.patchricevo il messaggiousage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Aaron Franke,

2
Fai attenzione git diff ...+ git apply ...non gestire i file eliminati / spostati correttamente ... quando git format-patch ...+ git am ...fai.
venerdì

50

Per produrre patch per diversi commit, dovresti usare il format-patchcomando git, ad es

git format-patch -k --stdout R1..R2

In questo modo i tuoi commit verranno esportati nel file patch nel formato della cassetta postale.

Per generare patch per l'ultimo commit, eseguire:

git format-patch -k --stdout HEAD^

Quindi in un altro repository applicare la patch con il amcomando git, ad es

git am -3 -k file.patch

Vedi: man git-format-patche git-am.


1
Che dire di una patch che può essere applicata con patch -p1? sourceware.org/glibc/wiki/…
Aaron Franke il

Stavo spostando la patch da Linux a Winodws, quindi ho dovuto usare --ignore-whitespace come menzionato qui stackoverflow.com/questions/13190679/…
Mahesh

2
@AaronFranke, puoi provare l'opzione '-p': git format-patch -p HEAD ^ 1
Piroxiljin

Da notare, questo ha il vantaggio di conservare i messaggi di commit, l'autore e le date di commit dei commit originali.
M. Justin,

0

Come complemento, per produrre patch per un solo commit specifico, utilizzare:

git format-patch -1 <sha>

Quando viene generato il file patch, assicurarsi che l'altro repository sappia dove si trova quando lo si utilizza git am ${patch-name}

Prima di aggiungere la patch, utilizzare git apply --check ${patch-name}per assicurarsi che non vi siano conflitti.

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.