2009-05-03 8 views
49

Configurare un progetto è facile in git e quindi posso avere repository separati anche per piccoli script. Ora il problema è come gestirli.Gestione di molti repository git

Io lavoro in più posti con questi repository. Quando ho apportato modifiche ad alcuni repository, voglio essere in grado di aggiornare i repository in altri posti.

Quindi ho una directory con molti repository al suo interno.

  1. Come posso recuperarli tutti?
  2. Come posso verificare se qualcuno di essi ha modifiche non accettate?
  3. Come posso verificare se qualcuno di loro ha delle modifiche da unire?

E sarebbe bello poterli fare con un solo comando.

L'output deve essere abbastanza silenzioso da notare effettivamente le cose da fare.

+0

La stessa domanda [risposta] (https://stackoverflow.com/a/48790388/2192488) per 'hg mercurial'. –

risposta

-1

Sembra che scrivere un copione per farlo sia abbastanza semplice. In sostanza ha bisogno di iterare i repository e poi usare i comandi come git ls-files, git diff e git log.

+0

So che è tardi, ma potresti pubblicare la sceneggiatura? – l0b0

+0

Non c'è "lo script". Sto usando uno script che ho scritto per i miei bisogni, ma non è generico. – iny

+0

"git diff" è in realtà difficile se si desidera ottenere un singolo file diff che può essere ripristinato e riapplicato con un singolo comando patch. – proski

6

Si potrebbe provare a utilizzare repo con un file personalizzato manifest.xml per specificare dove sono i repository. C'è some documentation su come fare questo.

In alternativa è possibile utilizzare git-submodule(1).

+1

Il sottomodulo git sarebbe buono, se volessi mantenere i repository nello stesso identico stato, ma non è così. L'insieme di repository non è lo stesso in ogni luogo. Potrebbero esserci modifiche non vincolanti. Potrebbero esserci dei cambiamenti che non voglio ancora unire. – iny

+0

Non sapevo del sottomodulo git. Grazie per averlo menzionato. – sykora

+0

La documentazione per i pronti contro termine è abbastanza ridotta e sembra che sia destinata a diversi tipi di flusso di lavoro che voglio utilizzare. – iny

0

si dovrebbe verificare rgit sul CPAN che esegue i comandi in modo ricorsivo Git su tutti i repository in un albero di directory.

Dalla documentazione:

Questa utilità ricerche ricorsivamente in una directory radice (che può essere la directory di lavoro corrente o - se è stato impostato - l'elenco in variabile di ambiente GIT_DIR) per tutti i repository git, ordinare questo elenco dal percorso del repository, chdir in ciascuno di essi ed esegue il comando git specificato.

3

Io uso questo script per eseguire facilmente comandi Git in tutti i miei repository.

#!/bin/sh 
if [ ! "$1" = "" ] ; then 

    if [ "$GITREPO" = "" -a -d "$HOME/cm/src" ] ; then 
     GITREPO="$HOME/cm/src" 
    fi 

    if [ "$GITREPO" != "" ] ; then 

     echo "Git repositories found in $GITREPO" 
     echo "-=-=-=-=-=-=-=-=-=-=-=-=-=-" 

     DIRS="`/bin/ls -1 $GITREPO`" 

     for dir in $DIRS ; do 

     if [ -d $GITREPO/$dir/.git ] ; then 
      echo "$dir -> git $1" 
      cd $GITREPO/$dir ; git [email protected] 
      echo 
     fi 

     done 
    else 

     echo "Git repositories not found." 

    fi 
fi 

Di default lo script cercherà repository git in ~/cm/src, ma si può ignorare questa impostando la variabile d'ambiente GITREPO a proprio piacimento.

Questo script è basato su this script.

37

consiglio vivamente lo strumento più repository mr. Ho usato per usare uno script di shell personalizzata come raccomandato da altri per qualche tempo, ma usando mr ha i seguenti vantaggi per me:

  • E 'generica: una congiunzione di diversi sistemi di controllo versione può essere utilizzato, non solo git (es. Mercuriale, SVN, ecc.).
  • È veloce: mr può eseguire più lavori in parallelo. Io uso un numero di repository git/mercurial e li sincronizzo più volte al giorno. Il signor accelera enormemente questo processo.
  • È facile e veloce gestire l'elenco dei checkout del repository. Usa semplicemente 'mr register' piuttosto che modificare l'elenco di progetti nel tuo script personalizzato.

Riguardo alla domanda sull'output silenzioso: il livello di verbosità può essere modificato utilizzando l'opzione della riga di comando -q. Preferisco l'output di default che sembra unificare bene l'output in un breve e chiaro riassunto.

Io uso il seguente alias per il comando mr per garantire che il sig prende sempre il mio elenco di progetti di default memorizzato in $ HOME, e utilizza 5 fili paralleli:

alias mr='mr -d ~/ -j 5 ' 
+3

Supporta Windows? –

+0

@FitzchakYitzchaki No: http://myrepos.branchable.com/install/ –

+0

è ottimo ma non supporta il git tagging (a partire dal 2016-08) –

4

gitslave è uno strumento in grado di eseguire il stesso comando su molti repository creando una relazione superprogetto/sottoprogetto tra il super e i sottotitoli. Questo (di default) fornisce il riepilogo delle uscite in modo da potersi concentrare sui repository che forniscono un output univoco (utile per lo stato git, non così utile per git ls-files).

Questo è in genere utilizzato per progetti in cui è necessario assemblare più repository insieme e tenerli sullo stesso ramo o tag allo stesso tempo o qualsiasi altra cosa. Per il mio elenco dei repository (nudi) Ho solo un po 'di makefile che mi permette di eseguire comandi git arbitrari, che, come si vede che uso principalmente per fsck e GC:

full: fsck-full gc-aggressive 
     @: 

fsck-full: 
     for f in */.; do (cd $$f; echo $$f; git fsck --full || echo $$f FAILED); done 

gc-aggressive: 
     for f in */.; do (cd $$f; echo $$f; git gc --aggressive || echo $$f FAILED); done 

%: 
     for f in */.; do (cd $$f; git [email protected] || echo $$f FAILED); done 
9

devo dire ho iniziato con l'attualmente accettato risposta (solo un gruppo di script di helpers che iterano sui repository), ma tutto sommato, è stata un'esperienza che mi mancava. Quindi, dopo aver provato i sottomoduli mr, repo e git, ho trovato ognuno privo di un modo diverso, quindi, ho finito per fare la mia variante: http://fabioz.github.io/mu-repo che è uno strumento maturo a questo punto, con flussi di lavoro che consentono la clonazione repository multipli, differenziandoli (e modificandoli), visualizzando in anteprima le modifiche in entrata, ecc.

-1

https://github.com/wwjamieson3/envisionTools ha uno script di bash chiamato gitstat che fa questo e molto altro ancora. È compatibile con GNU e Mac. Può eseguire recuperi da telecomandi, se richiesto. Mostra i file non tracciati, modificati, aggiunti, cancellati e messi in scena. Differisce con i telecomandi mostrando i commit non raggruppati sui telecomandi e sui commit locali non spinti. È inoltre in grado di visualizzare i risultati con codice colore in modalità sommario o dettagliata e persino in HTML. Usa locate invece di find perché è infinitamente più veloce e richiederà anche di aggiornare il database locate se sta diventando troppo vecchio.

+2

Grazie per pubblicare la tua risposta! Si prega di leggere attentamente le [FAQ sulla promozione di sé] (http://stackoverflow.com/faq#promotion) attentamente. Si noti inoltre che * è * richiesto * di pubblicare un disclaimer ogni volta che si collega al proprio sito/prodotto. –

+3

Sfortunatamente, il collegamento github wwjamieson3/envisionTools è rotto. –

+0

@williamJamieson è envisionTools è un repository GitHub privato? – eebbesen

9

gr (git-run) estende la funzionalità di mr (solo per git). Trovo più facile organizzare più repository git usando il suo sistema di tag. Il codice per gr non è ben mantenuto. Se stai utilizzando bash, assicurati di utilizzarlo con il modulo -t tag anziché #tag.

+0

Sembra che lo sviluppo abbia recuperato un po 'da allora: https://github.com/mixu/gr/graphs/contributors –

0

Se qualcuno sta ancora guardando questa discussione si prega di cassa my shell script chiamato Gitme

è necessario inserire manualmente i tuoi repos git locali, ma io uso questo strumento di tutti i giorni per collaborare più progetti git su più computer.

è possibile eseguire git clone https://github.com/robbenz/gitme.git

anche lo script è allocata sotto

#!/bin/bash -e 

REPOS=( 
/Users/you/gitrepo1 
/Users/you/gitrepo2 
/Users/you/gitrepo3 
/Users/you/gitrepo4 
) 

MOVE="Moving to next REPO... \n" 

tput setaf 2;echo "What ya wanna do? You can say push, pull, commit, ftp push, or status"; tput sgr0 

read input 

if [ $input = "commit" ] 
then 
    tput setaf 2;echo "Do you want a unique commit message? [y/n]";tput sgr0 
    read ans 
    if [ $ans = "y" ] 
    then 
     for i in "${REPOS[@]}" 
     do 
      cd "$i" 
      tput setaf 6;pwd;tput sgr0 
      git add . -A 
      read -p "Commit description: " desc 
      git commit -m "$desc" 
      tput setaf 2;echo $MOVE;tput sgr0 
      sleep 1 
     done 
    else 
     for i in "${REPOS[@]}" 
     do 
      cd "$i" 
      tput setaf 6;pwd;tput sgr0 
      git add . -A 
      git commit -m "autocommit backup point" 
      tput setaf 2;echo $MOVE;tput sgr0 
      sleep 1 
     done 
    fi 
elif [ $input = "push" ] || [ $input = "pull" ] || [ $input = "ftp push" ] || [ $input = "status" ] 
    then 
     for i in "${REPOS[@]}" 
do 
    cd "$i" 
    tput setaf 6;pwd;tput sgr0 
    git $input 
    tput setaf 2;echo $MOVE;tput sgr0 
    sleep 1 
    done 
else tput setaf 1;echo "You have zero friends";tput sgr0 
fi 

ho configurato un alias nel mio ~/.bash_profile così alias gitme='sh /path/to/gitme.sh'

1

ho appena creato uno strumento che fare ciò che tu vuoi!

  1. Come posso recuperarli tutti? gmaster fetch
  2. Come posso verificare se qualcuno di essi ha modifiche non accettate? gmaster status
  3. Come posso verificare se qualcuno di loro ha delle modifiche da unire? gmaster status

Si chiama gitmaster: https://github.com/francoiscabrol/gitmaster

2

È possibile utilizzare il git-status-all gioiello per questo: https://github.com/reednj/git-status-all

# install the gem  
gem install git-status-all 

# use the status-all subcommand to scan the directory 
git status-all 

C'è anche un'opzione che prendere di origine per tutti i repository prima di prendere visualizzazione dello stato:

git status-all --fetch 

git status all

+1

Approccio molto bello. In contrasto con la maggior parte degli strumenti più votati, non è necessario prima registrare i repository, ma semplicemente controlla tutte le sottodirectory. – luator