マイホームコンピュータでは、このスクリプトを使用して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')