Creare un'unica patch da commit multipli con git
Ci è capitato di dover effettuare delle modifiche a progetti che condividono alcuni file e, dato che non ci piace scrivere codice più di una volta, abbiamo pensato di usare git per creare una patch con le modifiche effettuate da applicare negli altri progetti. L'ipotetica struttura delle directory che contengono i 2 repository utilizzati per questo esempio è:
-- projects/
|---first_repo_path/
|---second_repo_path/
Creiamo la patch
Iniziamo con l'individuare a partire da quale commit vogliamo creare la patch. Entriamo nel primo repository e lanciamo il comando:
$ cd projects/first_repo_path/
$ git log --pretty=oneline --abbrev-commit -3
a5f83e3 fixes security bug #123
789f90c fixes security bug #98
48c120e fixes problems with rails_admin
che stampa alcuni dettagli importanti dei nostri commit. Individuiamo il commit a partire dal quale vogliamo creare la patch, nel nostro caso "789f90c" e lanciamo il comando:
git format-patch -M 789f90c --stdout > fixes_security_bugs.patch
Questo comando crea il file fixes_security_bugs.patch che incapsula le modifiche contenute negli ultimi 2 commit.
Applichiamo la patch ad un altro repository
Per applicare la patch nell'altro repository, muoviamoci nella root di quest'ultimo e lanciamo il comando per inserirla.
$ cd ../second_repo_path/
$ git am --signoff < ../first_repo_path/fixes_security_bugs.patch
Fatto!
Risolviamo eventuali conflitti
Se ci sono problemi e l'applicazione della patch fallisce, non verrà effettuata nessuna delle modifiche presenti nella patch. Possiamo risolvere il problema tramite il comando:
git apply --reject --whitespace=fix fixes_security_bugs.patch
verranno applicate solo le modifiche che non creano problemi. I pezzi di codice rifiutati verranno inseriti in dei file con estensione .rej. A questo punto possiamo importare manualmente il loro contenuto al posto giusto.