Gnu Parallelなしでgitリポジトリを同時にインポートできますか?

Gnu Parallelなしでgitリポジトリを同時にインポートできますか?

マイホームコンピュータでは、このスクリプトを使用してgitpull.shすべての変更を特定のディレクトリのgitリポジトリに同時にインポートします。

#!/usr/bin/bash

find $1 -name ".git" | sed -r 's|/[^/]+$||' | parallel git -C {} pull origin master

私の問題は、parallel仕事用コンピュータにソフトウェアがインストールされていないことです。スクリプトを使用せずにスクリプトを変更できますかparallel

答え1

並列化する代わりに、-P フラグで xargs を使用できます。それは次のとおりです。

find $1 -name ".git" | sed -r 's|/[^/]+$||' | xargs -I {} -n 1 -P 0 git -C {} pull origin master

答え2

このツールを使用できますGit+また、指定されたディレクトリのgitリポジトリに対するすべての変更を取得します。このコマンドを使用してください

$ git multi pull

簡単にインストールして使用できます。

答え3

bash、readlink、findを使用してこれを行うことができます。

#!/bin/bash

while IFS= read -d '' -r g ; do 
  dir="$(readlink -f "$g/..")"
  git pull -C "$dir" origin master &
done < <(find "$@" -name '.git' -print0)

検索-maxdepthオプションを慎重に使用すると、より高速に実行できます。たとえば、.gitすべてのディレクトリを見つけることができることがわかっている場合ただ現在のディレクトリの最上位サブディレクトリ内では、-maxdepth 3そのディレクトリがより低いサブディレクトリに繰り返されるのを防ぎます。

私はあなたが使用した引用符を付けられていないコマンドの代わりに"$@"このコマンドを使いました。したがって、ディレクトリパラメータはオプションであるだけでなく、複数のディレクトリパラメータを使用したり、コマンドラインに必要な検索オプションを追加したりすることもできます。find$1

対処方法コンピュータのバージョンがfindこれを行わない場合は、入力区切り文字として-print0使用できますが、\nディレクトリ名に改行文字(一般的ではなく完全に有効)が含まれていると、スクリプトは中断されます。

while IFS= read -r g ; do 
  dir="$(readlink -f "$g/..")"
  git pull -C "$dir" origin master &
done < <(find "$@" -name '.git')

関連情報