Em vez de paralelo, você pode usar xargs com o sinalizador -P. Algo como:
find $1 -name ".git" | sed -r 's|/[^/]+$||' | xargs -I {} -n 1 -P 0 git -C {} pull origin master
Na minha máquina doméstica, eu uso o script gitpull.sh
para puxar simultaneamente todas as alterações para os git repos em um determinado diretório.
#!/usr/bin/bash
find $1 -name ".git" | sed -r 's|/[^/]+$||' | parallel git -C {} pull origin master
Meu problema é que parallel
não está instalado no meu computador de trabalho. É possível alterar meu script sem o uso de parallel
?
Você pode usar essa ferramenta Git-Plus para puxar simultaneamente todas as alterações para os git repos em um determinado diretório. Use este comando
$ git multi pull
Você pode instalá-lo e usá-lo facilmente.
Você pode fazer isso usando apenas bash, readlink e encontrar:
#!/bin/bash
while IFS= read -d '' -r g ; do
dir="$(readlink -f "$g/..")"
git pull -C "$dir" origin master &
done < <(find "$@" -name '.git' -print0)
Você pode torná-lo um pouco mais rápido com o uso cuidadoso da opção -maxdepth
do find. por exemplo. Se você souber que todos os diretórios .git
serão encontrados somente nos subdiretórios de nível superior do diretório atual, -maxdepth 3
parará de recursionar em quaisquer subdiretórios inferiores. / p>
Eu usei "$@"
com o comando find
em vez do $1
não usado que você usou para que não apenas seja um argumento de diretório opcional, você pode usar vários argumentos de diretório e / ou adicionar quaisquer opções de localização precisa da linha de comando.
Se a versão de find
em seu computador de trabalho não for -print0
, você poderá usar \n
como o separador de entrada, mas o script será quebrado se qualquer nome de diretório contiver uma nova linha (o que é incomum perfeitamente válido).
while IFS= read -r g ; do
dir="$(readlink -f "$g/..")"
git pull -C "$dir" origin master &
done < <(find "$@" -name '.git')
Tags gnu-parallel