ver tipos tag repositorio que modificados log etiquetas crear archivos git multiple-repositories

tipos - Gestionando muchos repositorios de git.



que es un repositorio git (14)

¡Acabo de crear una herramienta que hace lo que quieres!

  1. ¿Cómo puedo obtener todos ellos? gmaster fetch
  2. ¿Cómo puedo comprobar si alguno de ellos tiene cambios no comprometidos? gmaster status
  3. ¿Cómo puedo verificar si alguno de ellos tiene cambios para fusionar? gmaster status

Se llama gitmaster: https://github.com/francoiscabrol/gitmaster

Configurar un proyecto es fácil en git y, por lo tanto, puedo tener un repositorio separado incluso para pequeños scripts. Ahora el problema es cómo gestionarlos.

Trabajo en múltiples lugares con estos repositorios. Cuando haya realizado cambios en algún repositorio, quiero poder actualizar los repositorios en otros lugares.

Así que tengo un directorio con muchos repositorios en él.

  1. ¿Cómo puedo obtener todos ellos?
  2. ¿Cómo puedo comprobar si alguno de ellos tiene cambios no comprometidos?
  3. ¿Cómo puedo verificar si alguno de ellos tiene cambios para fusionar?

Y sería bueno poder hacer esto con un solo comando.

La salida debe ser lo suficientemente silenciosa como para notar las cosas que se deben hacer.


Debería revisar rgit en el CPAN que ejecuta recursivamente los comandos git en todos los repositorios en un árbol de directorios.

De la documentación:

Esta utilidad recursivamente busca en un directorio raíz (que puede ser el directorio de trabajo actual o, si se ha establecido, el directorio dado por la variable de entorno GIT_DIR) para todos los repositorios de git, ordene esta lista por la ruta del repositorio, chdir en cada uno de ellos, y ejecuta el comando git especificado.


Debo decir que comencé con la respuesta actualmente aceptada (solo un puñado de scripts de ayudantes que recorren los repositorios), pero en general, fue una experiencia que me faltaba.

Entonces, después de probar mr, repo y git-submodules, encontré que cada uno carecía de una manera diferente, así que, terminé haciendo mi propia variante: http://fabioz.github.io/mu-repo que es una herramienta madura en este punto - tiene flujos de trabajo que le permiten:

  • clonar múltiples repos
  • Difunde (y edita) los cambios actuales en múltiples repos.
  • previsualizar los cambios entrantes
  • Ejecutar comandos en múltiples repos en paralelo
  • crear grupos de repos
  • Ejecutar comandos no relacionados con git sobre múltiples repos.
  • etc (ver http://fabioz.github.io/mu-repo de http://fabioz.github.io/mu-repo para más información).

Tenga en cuenta que es compatible con cualquier sistema operativo donde se ejecuta Python;)


Escribí esta función bash simple en mi .bash_profile para poder ejecutar git, maven, gradle o cualquier otro comando bash en todos los repositorios de git solamente:

# usefull function to work with multiple git repositories all() { failed=0 printf ''>>> START RUNNING: "%s" >>>'' "$*" for d in */; do pushd "$d" > /dev/null if [ -d ".git" ] then printf ''/n--------------------------------------------/n/n'' pwd eval $@ if [ $? -ne 0 ] then failed=1 break; fi fi popd > /dev/null done if [ $failed -eq 0 ] then printf ''/n--------------------------------------------/n'' printf ''<<< RAN "%s" WITH SUCCESS!!! <<<'' "$*" else printf ''/n<<< FAILED!!! <<<'' fi }

Esto puede ser usado de esta manera.

all git st all git pull all ./gradlew clean test etc.


He creado un alias y una función para ejecutar cualquier comando git en todos los repositorios disponibles en un directorio (recursivamente). Lo puedes encontrar aquí: https://github.com/jaguililla/dotfiles/git

Este es el código:

#!/bin/sh # To use it: source git_aliases # Example: rgita remote /; alias rgita=''find . -type d -name .git -execdir git'' # Example: rgit remote -vv rgit() { rgita "$@" /; }

Espero eso ayude :)


Parece que escribir un guión para hacerlo es bastante fácil. Esencialmente necesita iterar sobre los repositorios y luego usar comandos como git ls-files, git diff y git log.


Puede intentar usar repo con un archivo manifest.xml personalizado para especificar dónde están sus repositorios. Hay alguna documentación sobre cómo hacer esto.

Alternativamente puedes usar git-submodule(1) .


Puede usar la gema git-status-all para esto: 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

También hay una opción de recuperación que buscará desde el origen para todos los repositorios antes de mostrar el estado:

git status-all --fetch


Recomiendo la herramienta de repositorios múltiples mr . Solía ​​usar un script de shell personalizado según lo recomendado por otros durante algún tiempo, pero usar mr tiene los siguientes beneficios para mí:

  • Es genérico: se puede usar una combinación de varios sistemas de control de versiones, no solo git (por ejemplo, Mercurial, SVN, etc.).
  • Es rápido: mr puede ejecutar múltiples trabajos en paralelo. Uso varios repositorios de git / mercurial y los sincronizo varias veces al día. El señor acelera tremendamente este proceso.
  • Es fácil y rápido administrar la lista de cajas de depósito. Simplemente use ''mr register'' en lugar de modificar la lista de proyectos en su script personalizado.

Con respecto a su pregunta acerca de la salida silenciosa: el nivel de verbosidad se puede modificar usando el interruptor de línea de comando -q. Prefiero la salida predeterminada que parece unificar bien la salida en un resumen breve y claro.

Utilizo el siguiente alias para el comando mr para asegurarme de que mr siempre recoge mi lista de proyectos predeterminada almacenada en $ HOME y utiliza 5 subprocesos paralelos:

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


Si alguien sigue viendo este hilo, compruebe mi script de shell llamado gitme

necesitarás ingresar manualmente tus repositorios locales de git, pero uso esta herramienta todos los días para colaborar en múltiples proyectos de git en varias computadoras.

puede ejecutar git clone https://github.com/robbenz/gitme.git

También el guión se publica a continuación.

#!/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

Configuré un alias en mi ~ / .bash_profile así que alias gitme=''sh /path/to/gitme.sh''


Utilizo este script para ejecutar fácilmente comandos git en todos mis repositorios.

#!/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

Por defecto, el script buscará los repositorios git en ~ / cm / src, pero puede anular esto configurando la variable de entorno GITREPO a su gusto.

Este script se basa en este script .


gitslave es una herramienta que puede ejecutar el mismo comando en muchos repositorios creando una relación de superproyecto / subproyecto entre el super y los subs. Esto (de forma predeterminada) proporciona un resumen de salida para que pueda concentrarse en los repositorios que proporcionan una salida única (útil para el estado de git, no tan útil para los archivos git ls).

Esto se suele utilizar para proyectos en los que necesita reunir varios repositorios juntos y mantenerlos en la misma rama o etiqueta al mismo tiempo o lo que sea. Para mi directorio de repositorios (simples) tengo un pequeño makefile que me permite ejecutar comandos git arbitrarios, los cuales, como pueden ver, usan principalmente para fsck y 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


gr (git-run) extiende la funcionalidad de gr (solo para git ). Me resulta más fácil organizar varios repositorios git utilizando su sistema de etiquetas. Sin embargo, el código para gr no está bien mantenido. Si está usando bash, asegúrese de usarlo con la -t tag lugar de #tag form.


https://github.com/wwjamieson3/envisionTools tiene un script de bash llamado gitstat que hace esto y mucho más. Es compatible con GNU y Mac. Puede realizar recuperaciones desde mandos a distancia si se le pide. Muestra archivos sin seguimiento, modificados, agregados, eliminados y almacenados. Se diferencia con los controles remotos al mostrar confirmaciones no combinadas en controles remotos y confirmaciones locales no presionadas. También puede mostrar resultados codificados por colores en modo resumen o detallado e incluso HTML. Utiliza la localización en lugar de la búsqueda porque es infinitamente más rápida e incluso le pedirá que actualice su base de datos de localización si está envejeciendo.