2009-05-03 20 views
49

La configuración de un proyecto es fácil en git, por lo que puedo tener un repositorio independiente incluso para un script pequeño. Ahora el problema es cómo administrarlos.Administración de muchos repositorios git

Trabajo en varios 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 ir a buscar a todos ellos?
  2. ¿Cómo puedo verificar si alguno de ellos tiene cambios no confirmados?
  3. ¿Cómo puedo verificar si alguno de ellos tiene cambios para combinar?

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

La salida debe ser lo suficientemente silenciosa como para notar realmente las cosas que hay que hacer.

+0

La misma pregunta [respondida] (https://stackoverflow.com/a/48790388/2192488) para 'hg mercurial'. –

Respuesta

-1

Parece que escribir un script 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.

+0

Sé que es tarde, pero ¿podría publicar el guión? – l0b0

+0

No hay "el guión". Estoy usando un script que escribí para mis propias necesidades, pero no es genérico. – iny

+0

"git diff" es realmente complicado si desea obtener un solo archivo de diferencias que se puede revertir y volver a aplicar con un solo comando de parche. – proski

6

Puede intentar usar repo con un archivo personalizado manifest.xml para especificar dónde se encuentran sus repositorios. Hay some documentation sobre cómo hacer esto.

Alternativamente podría usar git-submodule(1).

+1

git-submodule sería bueno, si quisiera mantener los repositorios exactamente en el mismo estado, pero ese no es el caso. El conjunto de repositorios no es el mismo en cada lugar. Podría haber cambios no confirmados. Podría haber cambios que aún no deseo fusionar. – iny

+0

No sabía sobre git-submódulo. Gracias por mencionarlo. – sykora

+0

La documentación para el repositorio es bastante mínima y parece que está destinada a diferentes tipos de flujo de trabajo que quiero usar. – iny

0

Debe echar un vistazo rgit en el CPAN que de forma recursiva ejecuta comandos git en todos los repositorios en un árbol de directorios.

A partir de los documentos:

Esta utilidad busca recursivamente 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 .

3

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 [email protected] 
      echo 
     fi 

     done 
    else 

     echo "Git repositories not found." 

    fi 
fi 

Por defecto el script que buscará repositorios Git en ~/cm/src, pero se puede anular esta estableciendo la variable de entorno GITREPO a su gusto.

Este script se basa en this script.

37

Recomiendo mucho la herramienta de repositorios múltiples mr. Solía ​​usar una secuencia de comandos shell personalizado según lo recomendado por otros durante algún tiempo, pero utilizando mr tiene las siguientes ventajas para mí:

  • Es genérica: Una conjunción de diversos sistemas de control de versiones se puede utilizar, no sólo git (por ejemplo, Mercurial, SVN, etc.).
  • Es rápido: mr puede ejecutar varios trabajos en paralelo. Uso varios repositorios git/mercurial y los sincronizo varias veces al día. Mr tremendamente acelera este proceso.
  • Administrar la lista de registros de repositorio es fácil y rápido. Simplemente use 'mr register' en lugar de modificar la lista de proyectos en su script personalizado.

Con respecto a su pregunta sobre la salida silenciosa: El nivel de verbosidad se pueden modificar mediante el -q modificador de línea de comandos. 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 asegurar que el señor siempre recoge mi lista proyecto predeterminado almacenado en $ HOME, y utiliza 5 hilos paralelos:

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

¿Admite Windows? –

+0

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

+0

es genial, pero no admite el etiquetado de git (a partir de 2016-08) –

4

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

Esto se utiliza normalmente para proyectos en los que necesita ensamblar varios repositorios juntos y mantenerlos en la misma rama o etiqueta al mismo tiempo o lo que sea. Para mi directorio de repositorios (desnudos) Sólo tengo un poco de makefile que me permite ejecutar comandos git arbitrarios, que como veis que yo utilizo 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 [email protected] || echo $$f FAILED); done 
9

debo decir que empecé con la actualmente aceptada respuesta (solo un conjunto de scripts de ayudantes que iteran sobre los repositorios), pero en general, fue una experiencia que me faltó.

Entonces, después de probar mr, repo y git-submódulos, encontré que cada uno carece de una manera diferente, así que terminé haciendo mi propia variante: http://fabioz.github.io/mu-repo que es una herramienta madura en este momento, con flujos de trabajo que permiten la clonación múltiples repositorios, diferirlos (y editarlos), previsualizar los cambios entrantes, etc.

-1

https://github.com/wwjamieson3/envisionTools tiene un script bash llamado gitstat que hace esto y mucho más. Es compatible con GNU y Mac. Puede realizar recuperaciones desde controles remotos si se le solicita. Muestra los archivos sin seguimiento, modificados, agregados, eliminados y en etapas. Diferencias con los controles remotos al mostrar las asignaciones no fusionadas en los controles remotos y las asignaciones locales sin usar. También puede mostrar resultados codificados por colores en modo resumen o detallado e incluso HTML. Utiliza locate en lugar de find porque es infinitamente más rápido e incluso pedirá actualizar su base de datos de localización si se está haciendo demasiado vieja.

+2

Gracias por publicar su respuesta! Asegúrese de leer detenidamente [Preguntas frecuentes sobre autopromoción] (http://stackoverflow.com/faq#promotion). También tenga en cuenta que * se requiere * que publique un descargo de responsabilidad cada vez que se vincula a su propio sitio/producto. –

+3

Desafortunadamente, el enlace github wwjamieson3/envisionTools está roto. –

+0

@williamJamieson es envisionTools es un repositorio privado de GitHub? – eebbesen

9

gr (git-run) amplía la funcionalidad de mr (solo para git). Me resulta más fácil organizar múltiples repositorios git usando su sistema de etiquetas. El código para gr no está bien mantenido. Si usa bash, asegúrese de usarlo con el formulario -t tag en lugar del #tag.

+0

Parece que el desarrollo se ha recuperado un poco desde entonces: https://github.com/mixu/gr/graphs/contributors –

0

Si alguien todavía está estudiando este tema por favor el pago my shell script llamado gitme

tendrá que introducir manualmente los repositorios Git locales, pero puedo utilizar esta herramienta de uso diario para colaborar múltiples proyectos Git en varios equipos.

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

también la secuencia de comandos se fija abajo

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

puedo configurar un alias en mi ~/.bash_profile por lo alias gitme='sh /path/to/gitme.sh'

1

Acabo de crear una herramienta que haga lo ¡usted quiere!

  1. ¿Cómo puedo buscarlos a todos? gmaster fetch
  2. ¿Cómo puedo verificar si alguno de ellos tiene cambios no confirmados? gmaster status
  3. ¿Cómo puedo comprobar si alguno de ellos tiene cambios para combinar? gmaster status

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

2

Usted 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 que ir a buscar desde el origen de todos los repositorios antes de ir a buscar que muestra el estado:

git status-all --fetch 

git status all

+1

Muy buen enfoque. A diferencia de la mayoría de las herramientas más votadas, no es necesario registrar primero los repositorios, sino que simplemente verifica todos los subdirectorios. – luator

Cuestiones relacionadas