Configurar un proyecto es fácil en git y, por lo tanto, puedo tener un repositorio separado incluso para un script pequeño. Ahora el problema es cómo gestionarlos.
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.
- ¿Cómo puedo buscarlos todos?
- ¿Cómo puedo comprobar si alguno de ellos tiene cambios sin confirmar?
- ¿Cómo puedo comprobar 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 para notar realmente las cosas que se deben hacer.
hg mercurial
.Respuestas:
Recomiendo encarecidamente 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í:
Con respecto a su pregunta sobre 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 muy bien la salida en un resumen breve y claro.
Utilizo el siguiente alias para el comando mr para asegurarme de que mr siempre elija mi lista de proyectos predeterminada almacenada en $ HOME y use 5 subprocesos paralelos:
fuente
alias pa='find . -name .git -print -execdir git pull \;'
entonces,pa
es suficienteDebo decir que comencé con la respuesta actualmente aceptada (solo un montón de scripts de ayuda que iteran sobre los repositorios), pero en general, fue una experiencia deficiente para mí.
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:
Tenga en cuenta que es compatible con cualquier sistema operativo donde se ejecute Python;)
fuente
mu sh <some command>
para ejecutar algún comando arbitrario en múltiples repositorios, su finalidad es tratar con git y no con otros sistemas de control de versiones. .si lo necesita, entonces sí, utilice una herramienta diferente.gr (git-run) extiendela funcionalidad de mr (solo para
git
). Me resulta más fácil organizar varios repositorios de git usando su sistema de etiquetas. Singr
embargo, elcódigo deno está bien mantenido. Si está usando bash, asegúrese de usarlo con elformulario en-t tag
lugar de#tag
.fuente
Puede intentar usar el repositorio con un
manifest.xml
archivo personalizado para especificar dónde están sus repositorios. Existe alguna documentación sobre cómo hacer esto.Alternativamente, puede usar
git-submodule(1
) .fuente
Escribí una herramienta llamada " RepoZ " que descubre automáticamente los repositorios de git tan pronto como los clonas o cambias algo en ellos, como cambiar una rama, por ejemplo.
Una vez encontrados, los repositorios son "rastreados". Eso simplemente los mostrará en una lista de repositorios locales que incluyen una densa información de estado inspirada en posh-git . Esto contiene la rama actual y más cosas como ediciones de archivos y el recuento de confirmaciones entrantes o salientes.
Esto ayuda a realizar un seguimiento de sus repositorios locales y el trabajo inconcluso para confirmar o impulsar. Además, puede utilizar la lista de repositorios como navegación para cambiar de un repositorio a otro.
"¿Cómo puedo ir a buscarlos a todos?"
La versión para Windows ofrece un menú contextual para buscar o extraer un repositorio. Con la selección múltiple, puede ejecutar acciones en varios repositorios a la vez.
Sin embargo, puede encontrar otra función muy útil:
Con Auto fetch, puede decirle a RepoZ que busque los controles remotos de todos sus repositorios de git periódicamente en segundo plano. Estas recuperaciones no colisionarán con tus confirmaciones locales, por supuesto. No hay intentos de fusión locales como con
git pull
.fuente
gitslave es una herramienta que puede ejecutar el mismo comando en muchos repositorios creando una relación superproyecto / subproyecto entre el super y los subs. Esto (por defecto) proporciona un resumen de salida para que pueda concentrarse en los repositorios que proporcionan una salida única (útil para git status, no tan útil para git ls-files).
Esto se usa generalmente 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), solo tengo un pequeño archivo MAKE que me permite ejecutar comandos git arbitrarios, que, como puede ver, utilizo principalmente para fsck y gc:
fuente
He creado un alias y una función para ejecutar cualquier comando git en todos los repositorios disponibles en un directorio (de forma recursiva). Puedes encontrarlo aquí: https://github.com/jaguililla/dotfiles/git
Este es el código:
Espero eso ayude :)
fuente
.bash_aliases
:alias rgit='function _rgit(){ find . -type d -name .git -printf "\n%p\n" -execdir git "$@" \;; }; _rgit'
. Orínelo, luego prgit status
. Ej . Llame .Puede usar la
git-status-all
gema para esto: https://github.com/reednj/git-status-allTambién hay una opción de recuperación que buscará desde el origen para todos los repositorios antes de mostrar el estado:
fuente
find . -name .git -print -execdir git status \;
está bienUtilizo este script para ejecutar fácilmente comandos git en todos mis repositorios.
De forma predeterminada, el script buscará repositorios de git en ~ / cm / src, pero puede anular esto configurando la variable de entorno GITREPO a su gusto.
Este script se basa en este script .
fuente
find . -name .git -print -execdir git pull \;
hace lo que piensa.Escribí una herramienta de línea de comandos llamada gita para administrar múltiples repositorios. Muestra el estado de los repositorios registrados uno al lado del otro, por ejemplo
También puede delegar comandos / alias de git desde cualquier directorio de trabajo.
Ahora para responder a sus preguntas usando esta herramienta:
El
gita ls
comando muestra 3 símbolos posibles junto al nombre de la rama, que indica+
: cambios por etapas*
: cambios sin etapas_
: archivos / carpetas sin seguimientoLos nombres de las ramas están coloreados de 5 formas
Para instalarlo, simplemente ejecute
fuente
Si alguien todavía está mirando este hilo, consulte mi script de shell llamado gitme
Deberá ingresar manualmente sus repositorios de git locales, pero yo uso esta herramienta todos los días para colaborar en múltiples proyectos de git en múltiples computadoras.
Tu puedes correr
git clone https://github.com/robbenz/gitme.git
también el guión se publica a continuación
Configuré un alias en mi ~ / .bash_profile para
alias gitme='sh /path/to/gitme.sh'
fuente
Deberías revisar rgit en el CPAN que ejecuta recursivamente comandos git en todos los repositorios en un árbol de directorios.
De los documentos:
fuente
¡Acabo de crear una herramienta que hace lo que quieres!
gmaster fetch
gmaster status
gmaster status
Se llama gitmaster: https://github.com/francoiscabrol/gitmaster
fuente
Escribí esta función bash simple en mi .bash_profile para poder ejecutar git, maven, gradle o cualquier otro comando bash solo en todos los repositorios de git:
Esto se puede usar de esta manera
fuente
Descargo de responsabilidad: estoy trabajando en esta herramienta en www.repoflow.com
Estoy trabajando en esto, pero esto también está resolviendo las preguntas de OP y ayuda a administrar múltiples repositorios en general, puede usar la IU o la API GraphQL subyacente para crear sus propios scripts, considérelo como otra opción.
fuente
Hay una herramienta útil para buscar todos los repositorios múltiples.
git-pull-all
es una herramienta de línea de comandos para ejecutar en múltiples repositorios de git de forma asincrónica.Instalación
Uso
Suponga que tiene estos archivos y directorios:
Cuando ejecuta el
git-pull-all
comando en el~/Projects
directorio, debe encontrar repositorios git secundarios (en el caso anterior, cool-examples y super-express ) y luego ejecutargit pull
en cada uno de ellos.Enlace de GitHub: https://github.com/tatsuyaoiw/git-pull-all
fuente
Yo uso el código de Visual Studio. Tenemos alrededor de 20 bibliotecas en nuestra base de código que son repositorios de Git separados, y la pestaña de control de fuente en Visual Studio Code es bastante buena para ver una vista "de un vistazo" de qué tan retrasados o adelantados están los repositorios locales. También hay configuraciones para buscar periódicamente para mantener esa información actualizada, así como un botón de actualización.
No es tan conveniente como un script, pero cuando se trata de control de código fuente, me gusta ser el que hace los cambios. Se necesita un script muy bien escrito para tener cuidado de no sobrescribir los cambios, etc. Con el enfoque de VS Code, obtienes una buena cantidad de información rápidamente que puedes actuar por ti mismo.
Aquí hay una captura de pantalla de cómo se ve:
fuente
Encontré una gran solución para extraer de la rama actual de todos los subdirectorios que tienen una carpeta .git, incluso si cada repositorio tiene una rama diferente. El comando es de una sola línea, lo suficientemente flexible como para modificarlo para diferentes comandos de git y puede tener un alias.
Simplemente copie y pegue lo siguiente:
Desglosando:
Busque todos los directorios (-tipo d) en el directorio actual (find.) Que tengan el nombre ".git" (-name .git), buscando un máximo de dos directorios de profundidad (2 en lugar de 1 porque estamos buscando el git dentro de la carpeta git repo).
Ejecute el siguiente comando de shell (exec sh -c)
Cambie el directorio al primer argumento (cd $ 0), luego cambie el directorio un nivel hacia arriba para dejar la carpeta .git (cd ..) luego haga git pull origin mientras especifica la rama ejecutando git rev-parse ... para la rama actual HEAD cometer.
El "{}" es la ruta relativa de resultado que obtenemos del hallazgo inicial comando de . Los ; se utiliza para finalizar el comando.
Probado en MacOS 10.14.6 en zsh. Tal como está, funciona solo cuando las sucursales remotas y locales tienen el mismo nombre, AFAIK.
Puede modificar esto para obtener el estado. Espero que pueda agregar argumentos para hacer esto más flexible, pero aún no lo he intentado.
fuente
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 búsquedas desde controles remotos si se le solicita. Muestra archivos sin seguimiento, modificados, agregados, eliminados y organizados. Se diferencia con los controles remotos al mostrar confirmaciones no fusionadas 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 localizar en lugar de buscar porque es infinitamente más rápido e incluso le pedirá que actualice su base de datos de localización si se está volviendo demasiado antigua.
fuente
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.
fuente