Ejecute git gc en múltiples repositorys

Tengo una raíz de repository git en /git

Hay diferentes paths de profundidad, como:

 /git/project/project1/module1.git /git/project/project1/module2.git /git/project/project2/dev/module1.git /git/library/libgit2.git /git/library/jquery/jquery.git 

¿Cómo ejecuto git gc recursivamente en todos los repos internos /git ?

Preferiría usar un script de shell para iterar sobre los repositorys: si ese directory no es un repository válido de git, no ejecute git gc .

Podrías probar algo como:

 find /git -name '*.git' -execdir sh -c 'cd {} && git gc' \; 

Esto encontrará cada directory que coincida con *.git en /git , cd en él, y ejecute git gc .

Como find (versión 4.1) de msysgit es demasiado antiguo, la opción -execdir no es compatible.

Tenemos que escribir un bucle for en su lugar.

 for line in $(find /git -name '*.git'); do (cd $line && git gc); done 

En algunos sistemas (es decir, OSX), el bucle for trata espacios como delimitadores, rompiendo nombres de directory que contienen espacios. Establezca IFS para que solo use los saltos de línea \n para que esto funcione correctamente y restablezca el valor pnetworkingeterminado cuando finalice:

 oldIFS=$IFS; IFS=$'\n'; for line in $(find /git -name '*.git'); do (echo $line; cd $line; git gc); done; IFS=$oldIFS