118 votes

Gestion de nombreux référentiels git

Mettre en place un projet est facile à git et donc je peut référentiel de même pour un petit script. Maintenant, le problème est de savoir comment les gérer.

J'ai travailler dans plusieurs endroits avec ces référentiels. Lorsque j'ai fait les modifications apportées à certaines référentiel, je veux être en mesure de mettre à jour les dépôts dans d'autres endroits.

Donc, j'ai un répertoire avec beaucoup de dépôts en elle.

  1. Comment puis-je récupérer tous?
  2. Comment puis-je vérifier si l'une d'entre eux ont des modifications non validées?
  3. Comment puis-je vérifier si l'une d'entre eux ont des changements à fusionner?

Et il serait agréable d'être en mesure de le faire avec une seule commande.

La sortie doit être silencieux fait assez pour remarquer les choses à faire.

48voto

Sandro Giessl Points 241

Je vous recommande fortement les multiples dépôts outil monsieur. J'ai l'habitude d'utiliser un custom shell script, comme recommandé par les autres pendant un certain temps, mais à l'aide de m. a les avantages suivants pour moi:

  • Il est générique: la conjonction de divers systèmes de contrôle de version peut être utilisée, non seulement de git (par exemple, Mercurial, SVN, etc.).
  • C'est rapide: m. peut exécuter plusieurs tâches en parallèle. J'utilise un certain nombre de dépôts git/mercurial et les synchroniser plusieurs fois par jour. M. énormément accélère ce processus.
  • Il est facile et rapide pour gérer la liste de dépôt de la validation. Utilisez simplement "monsieur le registre" plutôt que sur la modification de la liste des projets dans votre script personnalisé.

En ce qui concerne votre question sur le silence de sortie: Le niveau de détail peut être modifié en utilisant le commutateur de ligne de commande -q. Je préfère la sortie par défaut qui s'affiche pour bien unifier la sortie dans un bref résumé.

J'utilise la suite des alias pour le mr de commande pour s'assurer que m. toujours à la ramasse par défaut de mon projet de liste stockée dans $HOME, et utilise 5 threads parallèles:

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

25voto

Fabio Zadrozny Points 11951

Je dois dire que j'ai commencé avec la actuellement accepté de répondre (juste un tas d'aides scripts qui itérer sur les dépôts), mais dans l'ensemble, je pense que c'est un manque d'expérience.

Donc, après avoir essayé de m. repo git-submodules, j'ai trouvé chaque dépourvues d'une manière différente, donc j'ai fini par faire mon propre variante: https://github.com/fabioz/mu-repo ce qui manque probablement les choses différemment pour d'autres personnes, mais il m'aide dans la synchronisation des choses et le plus important pour moi, à part aller dans chaque sous répertoire et l'exécution d'une commande, il peut diff à l'aide d'un outil externe (c'est à dire: WinMerge) et de modifier des choses dans cet outil et d'avoir la copie de travail mis à jour.

Aussi, il est fait en Python, donc ça devrait être facile à étendre et d'exécuter des commandes en parallèle comme m.). Il suffit de noter qu'à ce stade, il est encore un travail en cours, mais je trouve que c'est déjà utile.

10voto

Spoike Points 32082

Vous pouvez essayer d’utiliser repo avec un fichier personnalisé manifest.xml pour spécifier l’emplacement de vos référentiels. Il existe une documentation sur la façon de procéder.

Sinon, vous pouvez utiliser git-submodule(1 ) .

5voto

Scotts Points 88

J'utilise ce script pour exécuter facilement des commandes git dans tous mes référentiels.

 #!/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 $@
            echo
         fi

      done
   else

      echo "Git repositories not found."

   fi
fi
 

Par défaut, le script recherche les référentiels git dans ~ / cm / src, mais vous pouvez le remplacer en définissant la variable d'environnement GITREPO à votre convenance.

Ce script est basé sur ce script .

5voto

Seth Robertson Points 13276

gitslave est un outil qui permet d'exécuter la même commande beaucoup de dépôts par la création d'un superproject/sous-projet relation entre le super et le subs. C' (par défaut) fournit une sortie de synthèse, de sorte que vous pouvez vous concentrer sur les dépôts qui fournissent de sortie unique (utile pour git status, pas tellement utile pour git ls-files).

Ceci est généralement utilisé pour les projets pour lesquels vous avez besoin pour assembler plusieurs référentiels ensemble et de les garder sur la même branche ou une étiquette en même temps ou quoi que ce soit. Pour mon répertoire de (nu) référentiels j'ai juste un peu makefile qui me permet d'exécuter des commandes git, qui comme vous le voyez je utiliser, surtout pour fsck et 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 $@ || echo $$f FAILED); done

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X