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