2010-05-04 11 views
17

He estado buscando una solución para esto por un tiempo y no he encontrado todo lo que necesito.Estado de Git en varios repositorios en una Mac

Tengo varios repositorios Git en una carpeta de mi Mac (OSX 10.6) y me gustaría un script o herramienta que recorra todos los repositorios y me avise si alguno de ellos necesita commit ing.

Esta es mi estructura

Sites 
    /project1 
    /project2 
    /project3 

Quiero que la herramienta para hacer un git status en Sitios/proyecto 1, Sitios/project2, Sitios/proyecto3 y quiero saber si alguno de ellos tiene cambios o nuevos archivos que necesita ser escenificado o comprometido.

El guión más cercano que encontré que podría ser hackable is here, pero incluso esa secuencia de comandos no se presentaría, y me da un error:

"syntax error near unexpected token `do"

que podría haber sido escrito para * nix.

+3

OS X * es * Unix. ;) ¿Copiaste el script directamente? No quiero ser "ese tipo", pero funcionó para mí (es decir, no obtuve un error de sintaxis al ejecutarlo). – mipadi

+0

Sí, lo sabía, pero pensé que mi versión de bash carecía de alguna característica especial de Unix. Intenté copiar el código "en bruto" y funciona ahora, así que probablemente tenía que ver con copiarlo desde la página web anteriormente. Gracias por confirmar que funciona. – eapen

Respuesta

12

Hay un programa basado en Python, uncommitted que parece que haría exactamente lo que usted desea. Todavía no hay soporte para git (solo hg y Subversion), pero puede ayudar al autor a implementar el soporte git en su aplicación, o tomar sus ideas sobre cómo implementar sus cosas (documenta su método de búsqueda en la página del proyecto Me uní a).

+0

Gracias, esto parece prometedor. – eapen

+7

Gracias Ryan! Terminé creando una versión que tiene soporte de Git y solicité una extracción en bitbucket y también creé mi repositorio en github - http://github.com/eapen/uncommitted – eapen

+0

os x usuarios, para instalar do: sudo easy_install pip -> instalación sudo pip no confirmada -> no comprometida ~ –

4

Si solo desea el estado de los archivos en los repos locales, algo como esto: http://gist.github.com/389478 debería hacer el truco. Tendrá que modificar el patrón en el bucle for para recoger los directorios que desee.

+0

Voy a intentar esto pronto, estaba obteniendo los mismos errores de sintaxis cuando intenté ejecutarlo por primera vez usando el modo "raw", que podría tener que ver con los saltos de línea. Una vez que le dé una oportunidad, se lo haré saber. – eapen

+0

esto funciona muy bien para mí, gracias por publicar – subelsky

23

Parece que la pregunta ha sido respondida bien, pero quería dar mi granito de arena después de trabajar en lo mismo.

Me acerqué más a la respuesta de jcordasc mediante el uso de un simple script bash. Solo hice una cosa un poco diferente. En cuanto a los documentos de ayuda para git, puede configurar el directorio de git y el directorio de trabajo. Esto elimina la necesidad de 'cd' a los directorios. No es que realmente hace mucha diferencia ...

#!/bin/bash 

for gitdir in `find ./ -name .git`; 
    do 
     workdir=${gitdir%/*}; 
     echo; 
     echo $workdir; 
     git --git-dir=$gitdir --work-tree=$workdir status; 
    done 

Obviamente su es más avanzado/limpiador de la forma en que se muestra el estado ...

+0

Honestamente, hubiera preferido publicar esto como un comentario a la respuesta de jcordasc pero maldito si pudiera ver cómo lograr eso ... – Woody2143

+0

¡Agradable y simple! – eapen

+0

Puedes usar 'git -C $ gitdir' en lugar de las opciones' --gitdir' y '-work-tree'. Entonces, la última línea del bloque do se convierte en 'git -C $ gitdir status;'. –

5

Ésta es una pregunta más viejo, pero me fue y se actualiza la respuesta de jcordasc por lo que funciona con git 1.7.7.5, y pensé que pueda así contribuir aquí:

https://gist.github.com/3018100

Esta versión toma cualquier ruta o rutas como argumento, y da salida del jcordasc para cualquier repositorio Git él encuentra en cualquier lugar en los árboles de archivos representado por los argumentos. También es compatible con la detección de confirmaciones no acometidas y no fusionadas.

2

Me tomó un poco de tiempo para obtener el código de @ Andrew Roberts a trabajar con una serie de carpetas .. Si tienes problemas con eso también, comprobar mi tenedor en https://gist.github.com/3666392

Gracias por la gran guión @Andrew Roberts y @jcordasc .. justo lo que necesitaba.

+0

+1. Guión muy útil! –

2

La misma pregunta también se me ocurrió hoy y aparte de esta página, que me pareció muy útil y con muy buenos consejos, también me encontré con el following blog post. Se introduce un script en Python que hace exactamente eso:

Usage: show_status [options] 

Show Status is awesome. If you tell it a directory to look in, it'll scan 
through all the sub dirs looking for a .git directory. When it finds one it'll 
look to see if there are any changes and let you know. It can also push and 
pull to/from a remote location (like github.com) (but only if there are no 
changes.) Contact [email protected] for any support. 

Options: 
    -h, --help   show this help message and exit 
    -d DIRNAME, --dir=DIRNAME 
         The directory to parse sub dirs from 
    -v, --verbose   Show the full detail of git status 
    -r REMOTE, --remote=REMOTE 
         Push to the master (remotename:branchname) 
    -p PULL, --pull=PULL Pull from the master (remotename:branchname) 

Todo esto se encuentra en this git repo.

+0

Cuando intento ejecutarlo obtengo 'uso inconsistente de pestañas y espacios en la sangría'. – Zenadix

0

Esta es una manera fácil de hacer esas cosas en un solo trazador. Me falta un último paso que agregaré una vez que lo descubra (a menos que alguien más lo sepa).

Para una git status que puede hacer:

find ./Sites -name .git | awk '{ print "git --git-dir=" $1 " --work-tree " substr($1,1,length($1) - 4) " status" }' 

luego copiar la salida y ejecutarlo.

Para un diff completo, puede ejecutar:

find ./Sites -name .git | awk '{ print "git --git-dir=" $1 " --work-tree " substr($1,1,length($1) - 4) " --no-pager diff" }' 

Los copiar y pegar cosas que debe hacer me molesta. Se debe utilizar también xargs ahí, pero de alguna manera, se queja git:

find ./Sites -name .git | awk '{ print "--git-dir=" $1 " --work-tree " substr($1,1,length($1) - 4) " --no-pager diff" }' | xargs git 

Si alguien sabe cómo solucionar el reclamo git en esta última orden, por favor editar esta respuesta.

4

Comprobación de estado de repositorio múltiple con jsut un único alias de shell. No se requiere instalación. Todos los créditos a: https://coderwall.com/p/grmruq/git-status-on-all-repos-in-folder

Para bash:

alias gitstat='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c "(echo {} && cd {} && git status -s && echo)" \;' 
alias gitstatfull='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c "(echo {} && cd {} && git status && echo)" \;' 

o para cShell

alias gitstat   'find . -maxdepth 1 -mindepth 1 -type d -exec sh -c "(echo {} && cd {} && git status -s && echo)" \;' 
alias gitstatfull  'find . -maxdepth 1 -mindepth 1 -type d -exec sh -c "(echo {} && cd {} && git status && echo)" \;' 
1

muy tarde a la fiesta, pero yo escribimos una herramienta para hacer esto por mí. Es un script sencillo, y se puede encontrar on Github.

se ve así:

Projects/fboender/multi-git-status: Uncommitted changes; Projects/fboender/jerrybuild.tst: Needs push (doc, master); Projects/fboender/multi-git-status.bak: Needs push (master); Projects/fboender/tempita: ok; Projects/fboender/dirigent: Uncommitted changes Untracked files; Projects/flusso/boxes: ok; Projects/flusso/docker: ok; Projects/flusso/deployments: ok; Projects/flusso/backup: ok;

0

También hay una gema de rubíes por esto que funciona como un comando git substitución: 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 

git status all

0

respuesta @oxtay 's es la más bonita, así que he modifi ed para que sea aún más bonita: https://github.com/Flurrywinde/Git-Status

también corregidos algunos errores y lo hizo trabajar aún con algunos repos en mal estado que causó a lanzar errores de @Ferry Boender:

./git-ftp: ok 
./kphotoalbum: ls: cannot access './kphotoalbum/.git/refs/heads': No such file or directory 
fatal: Not a git repository: './kphotoalbum/.git' 
fatal: Not a git repository: './kphotoalbum/.git' 
fatal: Not a git repository: './kphotoalbum/.git' 
Uncommitted changes 
./SemanticForms: Uncommitted changes 
./git-big-picture: Uncommitted changes Untracked files 
./10-minute-vim-exercises: ok 
./moviemasher: Uncommitted changes 
./tumbdlwtf: Uncommitted changes 
./rotatezoomHTML5video: Uncommitted changes 
./tumbdl: Needs push (master) 
.: ls: cannot access './python/refs/heads': No such file or directory 
fatal: Not a git repository: './python' 
fatal: Not a git repository: './python' 
fatal: Not a git repository: './python' 
Uncommitted changes 
.: ls: cannot access 'mediawiki/refs/heads': No such file or directory 
fatal: Not a git repository: 'mediawiki' 
fatal: Not a git repository: 'mediawiki' 
fatal: Not a git repository: 'mediawiki' 
Uncommitted changes 
parser: ls: cannot access 'parser/.git/refs/heads': No such file or directory 
fatal: Not a git repository: 'parser/.git' 
fatal: Not a git repository: 'parser/.git' 
fatal: Not a git repository: 'parser/.git' 
Uncommitted changes 
./gundo.orig: Uncommitted changes 
./wikiteam: Uncommitted changes Untracked files 

@ un rubí de Nathan parece tienen un error, dando una [eRROR] cuando el repositorio está bien:

$ git status-all 
yourls-popular-clicks-extended              [ERROR] 
undefined local variable or method `s' for "yourls-popular-clicks-extended":String 
miniProxy                   [master] 
dmenu-4.6-kanon   M15U37             [master] 
freeCodeCamp                  [ERROR] 
undefined method `up_to_date?' for nil:NilClass 

$ mgitstatus      
./yourls-popular-clicks-extended: ok 
./miniProxy: ok 
./dmenu-4.6-kanon: Uncommitted changes Untracked files 
./freeCodeCamp: Untracked files 

Aviso cómo se dice [eRROR] para yourls-populares-clics extendida y freeCodeCamp. Mine y Ferry lo hacen bien.

La mina también conserva sus colores si se ejecuta como un subproceso de watch, lo que hace que sea conveniente limpiar sus repositorios y ver que cada uno se active en tiempo real.

Screenshot of mine in a tmux session where I'm cleaning up the repos

Cuestiones relacionadas