tipos - Gestionando muchos repositorios de git.
que es un repositorio git (14)
¡Acabo de crear una herramienta que hace lo que quieres!
- ¿Cómo puedo obtener todos ellos?
gmaster fetch
- ¿Cómo puedo comprobar si alguno de ellos tiene cambios no comprometidos?
gmaster status
- ¿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.
- ¿Cómo puedo obtener todos ellos?
- ¿Cómo puedo comprobar si alguno de ellos tiene cambios no comprometidos?
- ¿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
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.