Git: copia tutti i file in una directory da un altro ramo


189

Come copio tutti i file in una directory da un altro ramo? Posso elencare tutti i file in quella directory facendo

git ls-tree master:dirname

Posso quindi copiare tutti i file individualmente facendo

git checkout master -- dirname/filename

Tuttavia, l'utilizzo di caratteri jolly è stato finora un fallimento totale. Questo non fa nulla:

git checkout master -- dirname/*.png

Anche se immagino di poter usare uno script bash per farlo, ci deve essere un modo più semplice, giusto?

Risposte:


289

Dato che non stai provando a spostare i file nella struttura, dovresti essere in grado di controllare semplicemente la directory:

git checkout master -- dirname

2
E se volessi conservare i messaggi di commit per i file copiati?
totels

2
@totels, a rigor di termini non ci sono messaggi di commit associati ai file; il messaggio di commit è associato all'oggetto stesso di commit. Questo è quello che immagino tu voglia: git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;dove $COMMIT_SHA1potrebbe essere come branch_asarebbe l'oggetto di commit che ha il messaggio di commit che desideri. Non so a mano a mano come determinare programmaticamente il commit con l'ultima modifica adirname
Alexander Bird

1
Questo ha un effetto collaterale molto strano. Si copia dirnamesopra, ma ha anche copia tutti i file che si trovano nella .gitignoredel masterramo. Qualche idea sul perché?
Milimetrico

4
Un altro effetto collaterale penso che se il ramo corrente ha file aggiuntivi non nel ramo da cui stai estraendo (in una determinata cartella di destinazione), fondamentalmente li unirà insieme - forse questo è solo se uno è un antenato? Non sono esattamente sicuro delle condizioni, ma se hai 20 file nel ramo A e 20 file nel ramo B e solo 10 di loro hanno lo stesso nome file, finisci con 30 file (almeno nel mio caso in cui ramo A è l'antenato del ramo B)
codercake,

@totels controlla il comando git cherry-pick. Applica i commit da altri rami, ma solo i file che sono stati modificati nei commit desiderati.
cs01,

18

Se non ci sono spazi nei percorsi e sei interessato, come me, solo ai file con estensione specifica, puoi usare

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')

4
È un peccato che git non supporti direttamente questa funzione. Esattamente come l'OP, avrei pensato che sarebbe stato qualcosa del generegit checkout master -- *.c
Gregory Kuhn,

1
Questa risposta mi ha aiutato a rispondere "Come posso effettuare il checkout dei file di un determinato modello da un altro ramo al mio attuale ramo di lavoro?"
usr-local-ΕΨΗΕΛΩΝ
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.