Ejecute git pull sobre todos los subdirectorios [duplicado]

Resuelto Petah asked hace 14 años • 16 respuestas

¿Cómo puedo actualizar varios repositorios de git desde el directorio principal compartido sin cdacceder 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.

Petah avatar Aug 17 '10 03:08 Petah
Aceptado

Ejecute lo siguiente desde el directorio principal, pluginsen 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 dpara buscar directorios, no archivos
  • -depth 1para una profundidad máxima de un subdirectorio
  • -exec {} \;ejecuta un comando personalizado para cada búsqueda
  • git --git-dir={}/.git --work-tree=$PWD/{} pullgit extrae los directorios individuales

Para jugar con buscar, recomiendo usar echoafter -execpara 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 1opción no está disponible, prueba -mindepth 1 -maxdepth 1.

leo avatar Sep 19 '2012 13:09 leo
ls | xargs -I{} git -C {} pull

Para hacerlo en paralelo:

ls | xargs -P10 -I{} git -C {} pull
Dmitry Mitskevich avatar Mar 16 '2015 08:03 Dmitry Mitskevich

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).

Ingo Blechschmidt avatar Feb 05 '2015 15:02 Ingo Blechschmidt

En realidad, si no sabes si las subcarpetas tienen un repositorio de git o no, lo mejor sería dejar que findobtenga 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 }
Gildas avatar Nov 15 '2016 03:11 Gildas