Posso ao mesmo tempo puxar meus repositórios git sem o gnu paralelo?

1

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 ?

    
por Brian Fitzpatrick 04.01.2018 / 09:15

3 respostas

2

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
    
por 04.01.2018 / 09:48
2

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.

    
por 04.01.2018 / 11:01
1

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')
    
por 04.01.2018 / 10:28