Ho due repository. In uno, apporto le modifiche al file ./hello.test
. Applico le modifiche e creo una patch da tale commit con git format-patch -1 HEAD
. Ora, ho un secondo repository che contiene un file che ha lo stesso contenuto di hello.test ma è collocato in una directory diversa con un nome diverso: ./blue/red/hi.test
. Come faccio ad applicare la patch summenzionata al file hi.test
? Ho provato con lo git am --directory='blue/red' < patch_file
ma questo ovviamente si lamenta che i file non hanno lo stesso nome (che pensavo che a Git non interessasse?). So che probabilmente potrei modificare il diff da applicare a quel file specifico, ma sto cercando una soluzione di comando.Come applicare una patch Git a un file con un nome e un percorso diverso?
risposta
È possibile creare la patch utilizzando git diff
e quindi applicarla utilizzando l'utilità patch
, che consente di specificare il file a cui si desidera applicare la differenza.
Ad esempio:
cd first-repo
git diff HEAD^ -- hello.test > ~/patch_file
cd ../second-repo
patch -p1 blue/red/hi.test ~/patch_file
Ah, bello, non ci pensavo. Tuttavia, esiste un modo per farlo con i comandi Git in modo che i dati di commit (data e ora, autore commit, messaggio di commit) siano mantenuti gli stessi? – mart1n
È possibile che ci sia qualcosa che puoi fare con 'am' o' apply', ma non riesco a trovarlo. Se ti ritrovi a duplicare molto le modifiche, potrebbe esserci una soluzione migliore utilizzando i sottomoduli o qualunque altra lingua prescelta fornisca per condividere il codice (ad esempio in Ruby potresti estrarre il codice duplicato come una gemma). – georgebrock
Questo è in realtà correlato alla documentazione (i file di origine sono XML). I sottomoduli non sono davvero un'opzione, dato che dovrei fare un caso forte per loro nella nostra infrastruttura esistente. – mart1n
Rispondendo alla mia domanda con uno script che fa proprio questo: https://github.com/mprpic/apply-patch-to-file
Invece di modificare il file di patch manualmente, richiede all'utente per il file di destinazione, modifica il patch e lo applica al repository al momento.
Esiste una soluzione semplice che non prevede la modifica manuale delle patch né uno script esterno.
Nel primo repository (questo può anche esportare un intervallo di commit, utilizzare -1
se si desidera selezionare solo un commit):
git format-patch --relative <committish> --stdout > ~/patch
Nel secondo repository:
git am --directory blue/red/ ~/patch
Invece di utilizzare --relative
in git format-patch
, un'altra soluzione è utilizzare l'opzione -p<n>
in git am
per rimuovere le directory n
dal percorso delle patch, come indicato in un answer to a similar question.
È inoltre possibile eseguire git format-patch --relative <committish>
senza il --stdout
e genera un set di file .patch
. Questi file possono quindi essere inviati direttamente a git am
con git am --directory blue/red/ path/to/*.patch
.
Questo si basa ancora sul fatto che i nomi dei file sono gli stessi, giusto? – mart1n
salvato il mio giorno :) – tuxinaut
Si noti che l'opzione '--directory' sembra richiedere di specificare il percorso completo della directory relativo alla root del repository; qualcosa come '--directory =. /' mentre chdir'd in una sottodirectory nel repository non funzionerà. – Reid
- 1. Come posso applicare un file patch in git
- 2. Come applicare una patch generata con git format-patch?
- 3. Come applicare una patch a un progetto Java?
- 4. come applicare più patch git in un colpo
- 5. Come applicare una patch solo a un particolare da un diff
- 6. Bower: come applicare una patch a un pacchetto o applicare le sostituzioni?
- 7. Applicare git .gitignore a un repository esistente
- 8. Come applicare una patch molto vecchia in Git?
- 9. Come creare una patch con git-extensions
- 10. Applicare un diff da un ramo come patch a un altro in Visual Studio TFS
- 11. Come posso modificare il percorso del file in una serie di patch Git?
- 12. Distribuzione file di guerra per Tomcat con un percorso diverso
- 13. Come posso applicare un nome a un ambiente?
- 14. In git, come faccio a rimuovere un commit da un ramo e applicarlo a un ramo diverso?
- 15. Come creare un file patch su Windows?
- 16. Perché git-status mostra un file binario aggiornato con un nuovo nome come un nuovo nome?
- 17. Come impostare un ramo git per passare a un remoto con un nome di ramo diverso e passare da un URL completamente diverso
- 18. Rimuovere un file con un nome strano da git
- 19. Come applicare una patch dinamica a un'applicazione ASP.NET in esecuzione?
- 20. Come copiare un pacchetto di Monticello a un altro repository con un nome diverso con Gofer
- 21. caricamento di una variabile da un file .mat in una variabile con un nome diverso
- 22. Come posso applicare una patch a un metodo privato di una classe delphi?
- 23. Come creare e applicare la patch SVN?
- 24. Come scrivere un percorso completo in un file batch con un nome di cartella con spazio?
- 25. Come collegarsi a un diverso file libc?
- 26. Con git, come si cerca un modello di file con `git log` invece di un percorso file?
- 27. Problemi con git format-patch/am (patch non applicabile)
- 28. Ottieni il nome file e l'estensione da un percorso assoluto
- 29. Una risorsa esiste con un caso diverso
- 30. Impossibile utilizzare git add con l'opzione --patch
Correlato a: https://stackoverflow.com/q/3367254/1959808 –