Ejecute git pull sobre todos los subdirectorios [duplicado]
¿Cómo puedo actualizar varios repositorios de git desde el directorio principal compartido sin cd
acceder al directorio raíz de cada repositorio? Tengo lo siguiente, que son todos repositorios de git separados ( no submódulos):
/plugins/cms
/plugins/admin
/plugins/chart
Quiero actualizarlos todos a la vez o al menos simplificar mi flujo de trabajo actual:
cd ~/plugins/admin
git pull origin master
cd ../chart
git pull
etc.
Ejecute lo siguiente desde el directorio principal, plugins
en este caso:
find . -type d -depth 1 -exec git --git-dir={}/.git --work-tree=$PWD/{} pull origin master \;
Para aclarar:
find .
busca en el directorio actual-type d
para buscar directorios, no archivos-depth 1
para una profundidad máxima de un subdirectorio-exec {} \;
ejecuta un comando personalizado para cada búsquedagit --git-dir={}/.git --work-tree=$PWD/{} pull
git extrae los directorios individuales
Para jugar con buscar, recomiendo usar echo
after -exec
para obtener una vista previa, por ejemplo:
find . -type d -depth 1 -exec echo git --git-dir={}/.git --work-tree=$PWD/{} status \;
Nota: si la -depth 1
opción no está disponible, prueba -mindepth 1 -maxdepth 1
.
ls | xargs -I{} git -C {} pull
Para hacerlo en paralelo:
ls | xargs -P10 -I{} git -C {} pull
Un poco más sencilla que la solución de Leo:
for i in */.git; do ( echo $i; cd $i/..; git pull; ); done
Esto actualizará todos los repositorios de Git en su directorio de trabajo. No es necesario enumerar explícitamente sus nombres ("cms", "admin", "chart"). El comando "cd" solo afecta a un subshell (generado entre paréntesis).
En realidad, si no sabes si las subcarpetas tienen un repositorio de git o no, lo mejor sería dejar que find
obtenga los repositorios por ti:
find . -type d -name .git -exec git --git-dir={} --work-tree=$PWD/{}/.. pull origin master \;
El equivalente de PowerShell sería:
Get-ChildItem -Recurse -Directory -Hidden -Filter .git | ForEach-Object { & git --git-dir="$($_.FullName)" --work-tree="$(Split-Path $_.FullName -Parent)" pull origin master }