2013-07-10 12 views
19

Ho un repository git che contiene altri repository git. Ci sono comandi che spingono e/o tirano in modo ricorsivo non solo per il meta-repository ma per i sotto-repository?Git ricorsivo push/pull?

+0

Possibile duplicato di [Git: modo più semplice per estrarre tutti i sottomoduli] (http://stackoverflow.com/questions/1030169/git-easy-way-pull-latest-of-all-submodules). –

risposta

8

se si parla di sottomoduli, vedere la risposta cupcakes.

se si sta parlando di una certa gerarchia di cartelle contenente repo git, potete verifica clustergit, uno strumento ho programmato: https://github.com/mnagel/clustergit

+0

Grazie, ci proverò. Supponendo che i telecomandi siano stati precedentemente impostati, dovrei semplicemente eseguire "clustergit -p" nella directory in alto per eseguire ricorsivamente? –

+0

@ DavidY.Stephenson sì, clustergit scriverà ricorsivamente una directory (default: '.') per le directory' .git' per decidere dove risiedono i repository git. quindi esegue 'git status' su questi. se lo stato è pulito e '-p' è specificato, farà un' git pull' che avrà successo solo se è stato impostato un telecomando, altrimenti apparirà un avviso (ma clustergit continuerà con altri repository). – mnagel

+0

Potrebbe darmi un comando di esempio per dire, spingere in modo ricorsivo al master di origine?Sto avendo qualche problema a metterlo insieme dalla documentazione. –

8

Non proprio git pull, ma quasi:

git fetch --recurse-submodules 

Da the Git docs:

--recurse-submodules[=yes|on-demand|no]

Questa opzione controlla se e in quali devono essere recuperati anche condizioni nuove impegna di sottomoduli popolate. Può essere usato come opzione booleana per disabilitare completamente la ricorsione quando è impostato su no o per ricorrere incondizionatamente a tutti i sottomoduli popolati quando è impostato su sì, che è il valore predefinito quando questa opzione viene utilizzata senza alcun valore. Usa on-demand per recurse solo in un sottomodulo popolato quando il superproject recupera un commit che aggiorna il riferimento del sottomodulo a un commit che non è già nel clone del sottomodulo locale.

+0

Non mi riferisco (consapevolmente) ai sottomoduli. Ho un repository che contiene altri repository. Tutti questi repository dove sono stati inizializzati da me. Devo trasformarli in qualche modo in sottomoduli? –

9

mi trovo nella stessa situazione ogni volta che voglio aggiornare i miei repository LLVM/Clang e con un po 'di aiuto bash posso 'git pull' ognuno di loro in questo modo:

$> for dir in $(find . -name ".git"); do cd ${dir%/*}; git pull ; cd -; done

questo sarà 'git pull' tutti i pronti contro termine git trovati sotto la directory corrente, e il lavoro probabilmente non se sono repository nudi .

1

Ho appena scritto uno script da eseguire in modo ricorsivo su più repository git. È possibile prendere da qui:

https://github.com/DariuszOstolski/rgit

L'idea è esattamente lo stesso come in clustergit ma la loro attuazione è diversa.