2012-01-12 10 views
5

Me gustaría saber si hay una forma de determinar qué subcarpetas bajo un directorio específico son proyectos git. Después de lo cual, verifique cuáles de esos proyectos de git necesitan actualización a través de 'git fetch' o de otro modo.Verificar recursivamente las actualizaciones del directorio git

Por ejemplo, tengo una carpeta llamada desarrollo en mi carpeta de inicio, que contiene varios proyectos, de los cuales el 10% usa git. En lugar de verificar individualmente las actualizaciones del proyecto, me gustaría poder ejecutar un comando que compruebe si hay actualizaciones para todas las carpetas de git en el directorio de desarrollo.

También sería bueno si pudiera actualizar proyectos no conflictivos.

Respuesta

3

Una forma de obtener una lista de todos los repositorios Git bajo el directorio actual es con el siguiente comando:

find . -name '.git' | xargs -n 1 dirname 

A continuación, podría alimentar a esto en un shell script que se ejecuta el comando de selección en cada repositorio, ya sea cambiando al directorio o usando los argumentos --git-dir y --work-tree de Git.

+0

Podría explicar el argumento -n en el comando xargs. Eché un vistazo a las páginas man, sin embargo, todavía no estoy seguro de la función que realiza. –

+0

@MrAxilus xargs usualmente usa todos los resultados como parámetros de línea de comando para el comando especificado (es dirname en nuestro caso). -n pide dividir todas las piezas de entrada de 1 palabra y llamar al nombre de directorio para cada pieza. –

+0

@AlexandrPriymak, ya veo. ¿No sería mejor usar el argumento find -exec? –

1

Eche un vistazo a repo de android. Creo que no hay nada específico de Android en él y podrás adaptarlo a tus necesidades.

+0

Hmm, ¿qué hace exactamente el repositorio que ese git no tiene? –

3

Aquí es un (hacky) de una sola línea para que:

back=`pwd`; for d in `find . -type d -name .git` ; do cd "$d/.."; git pull ; cd $back ; done 
+0

salvavidas lol :) –

1

En resumen:

find . -name .git -execdir git pull -v ';' 

También puede crear el siguiente script (por ejemplo update_src.sh):

#!/bin/sh 
# Script to pull all git repositories to the recent version. 
ROOT=$(git rev-parse --show-toplevel 2> /dev/null) 
find "$ROOT" -name .git -type d -execdir git pull -v ';' 

o cree un alias siguiente en shell:

alias git-pull-all='find $(git rev-parse --show-toplevel 2> /dev/null) -name .git -type d -execdir git pull -v ";"' 

o en su ~/.gitconfig.

Cuestiones relacionadas