各リポジトリのルートディレクトリにcd
'ingせずに、共有された親のディレクトリから複数のgitリポジトリを更新するにはどうすればよいですか?私は次のものを持っています。それらはすべて別々のgitリポジトリです(notサブモジュール):
/plugins/cms
/plugins/admin
/plugins/chart
すべてを一度に更新するか、少なくとも現在のワークフローを簡素化します。
cd ~/plugins/admin
git pull Origin master
cd ../chart
git pull
等.
親ディレクトリから次を実行します。この場合、plugins
:
find . -type d -depth 1 -exec git --git-dir={}/.git --work-tree=$PWD/{} pull Origin master \;
明確にするために:
find .
は現在のディレクトリを検索します-type d
はファイルではなくディレクトリを検索します-depth 1
最大の深さの1つのサブディレクトリ-exec {} \;
は、すべての検索に対してカスタムコマンドを実行しますgit --git-dir={}/.git --work-tree=$PWD/{} pull
gitは個々のディレクトリをプルしますFindを試してみるには、-exec
の後にecho
を使用してプレビューすることをお勧めします。例:
find . -type d -depth 1 -exec echo git --git-dir={}/.git --work-tree=$PWD/{} status \;
注:-depth 1
オプションが使用できない場合は、-mindepth 1 -maxdepth 1
を試してください。
ls | xargs -I{} git -C {} pull
並行して行うには:
ls | xargs -P10 -I{} git -C {} pull
レオのソリューションよりも少しローテク:
for i in */.git; do ( echo $i; cd $i/..; git pull; ); done
これにより、作業ディレクトリ内のすべてのGitリポジトリが更新されます。名前を明示的にリストする必要はありません(「cms」、「admin」、「chart」)。 「cd」コマンドは、サブ括弧(括弧を使用して生成された)にのみ影響します。
私はこれを使用します:
find . -name ".git" -type d | sed 's/\/.git//' | xargs -P10 -I{} git -C {} pull
ユニバーサル:現在のディレクトリの下にあるすべてのgitリポジトリを更新します。
実際、サブフォルダーにgitリポジトリがあるかどうかわからない場合は、find
にリポジトリを取得させるのが最善です。
find . -type d -name .git -exec git --git-dir={} --work-tree=$PWD/{}/.. pull Origin master \;
PowerShellに相当するものは次のとおりです。
Get-ChildItem -Recurse -Directory -Hidden -Filter .git | ForEach-Object { & git --git-dir="$($_.FullName)" --work-tree="$(Split-Path $_.FullName -Parent)" pull Origin master }
Cms、admin、およびchartがすべてリポジトリの一部である限り、これは自動的に行われます。
考えられる問題は、これらのプラグインがそれぞれgitサブモジュールであることです。
詳細については、git help submodule
を実行してください。
編集
Bashでこれを行うには:
cd plugins
for f in cms admin chart
do
cd $f && git pull Origin master && cd ..
done
すべてのサブディレクトリがgitリポジトリであると仮定した場合の最もコンパクトな方法:
ls | parallel git -C {} pull
gitfox
は、すべてのサブリポジトリでコマンドを実行するツールです
npm install gitfox -g
g pull
トップ5の回答のどれも私にとってはうまくいかず、質問はディレクトリについて語っています。
これはうまくいきました:
for d in *; do pushd $d && git pull && popd; done
これを試すことができます
find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;
また、&&のような引数をもう1つ追加することで、カスタマイズした出力を追加できます。
find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull && git status" \;
元の回答2010:
これらのディレクトリがすべて別個のgitリポジトリである場合、それらをsubmodulesとして参照する必要があります。
つまり、「Origin」は、サブリポジトリ「plugins
」、「cms
」、「admin
」への参照のみを含むリモートリポジトリ「chart
」になります。
git pull
の後にgit submodule update
が続くと、探しているものが実現します。
2016年1月の更新:
Git 2.8(2016年第1四半期)では、git fetch --recurse-submodules -j2
を使用してサブモジュールを並行して(!)フェッチできます。
「 git clone --recursive?を使用してgitサブモジュールのダウンロードを高速化/並列化する方法 」を参照してください
私の謙虚な構造
.git
サブフォルダーを直接探します:非gitサブフォルダーでgitコマンドを発行する可能性が低いfind
の警告を取り除きます次のように:
find . \
-maxdepth 2 -type d \
-name ".git" \
-execdir python -c 'import os; print(os.path.abspath("."))' \; \
-execdir git pull \;
もちろん、追加の-execdir
オプションを持つgitコマンドをfind
に追加して、たとえばブランチを表示できます:
find . \
-maxdepth 2 -type d \
-name ".git" \
-execdir python -c 'import os; print(os.path.abspath("."))' \; \
-execdir git branch \;
-execdir git pull \;
これを使う
for dir in $(find . -name ".git")
do cd ${dir%/*}
echo $PWD
git pull
echo ""
cd - > /dev/null
done
いくつかのコメントと回答のポイントを組み合わせました。
find . -maxdepth 1 -type d -name .git -execdir git pull \;