web-dev-qa-db-ja.com

すべてのサブディレクトリでgit pullを実行します

各リポジトリのルートディレクトリにcd 'ingせずに、共有された親のディレクトリから複数のgitリポジトリを更新するにはどうすればよいですか?私は次のものを持っています。それらはすべて別々のgitリポジトリです(notサブモジュール):

/plugins/cms
/plugins/admin
/plugins/chart

すべてを一度に更新するか、少なくとも現在のワークフローを簡素化します。

cd ~/plugins/admin
git pull Origin master
cd ../chart
git pull

等.

207
Petah

親ディレクトリから次を実行します。この場合、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を試してください。

267
leo
ls | xargs -I{} git -C {} pull

並行して行うには:

ls | xargs -P10 -I{} git -C {} pull
161

レオのソリューションよりも少しローテク:

for i in */.git; do ( echo $i; cd $i/..; git pull; ); done

これにより、作業ディレクトリ内のすべてのGitリポジトリが更新されます。名前を明示的にリストする必要はありません(「cms」、「admin」、「chart」)。 「cd」コマンドは、サブ括弧(括弧を使用して生成された)にのみ影響します。

49

私はこれを使用します:

find . -name ".git" -type d | sed 's/\/.git//' |  xargs -P10 -I{} git -C {} pull

ユニバーサル:現在のディレクトリの下にあるすべてのgitリポジトリを更新します。

21
Liudvikas

実際、サブフォルダーに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 }
16
Gildas

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
11
Jamie Wong

すべてのサブディレクトリがgitリポジトリであると仮定した場合の最もコンパクトな方法:

ls | parallel git -C {} pull
10
cmcginty

gitfoxは、すべてのサブリポジトリでコマンドを実行するツールです

npm install gitfox -g
g pull
4
eqfox

トップ5の回答のどれも私にとってはうまくいかず、質問はディレクトリについて語っています。

これはうまくいきました:

for d in *; do pushd $d && git pull && popd; done
4
Ryan

これを試すことができます

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" \;
2

元の回答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サブモジュールのダウンロードを高速化/並列化する方法 」を参照してください

1
VonC

私の謙虚な構造

  • 現在のパスを表示します(Pythonを使用し、便利で機能します。 ファイルのフルパスを取得する方法? を参照してください)
  • .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 \;
1
Raffi

これを使う

for dir in $(find . -name ".git")
do cd ${dir%/*}
    echo $PWD
    git pull
    echo ""
    cd - > /dev/null
done

Github

0
P Pang

いくつかのコメントと回答のポイントを組み合わせました。

find . -maxdepth 1 -type d -name .git -execdir git pull \;
0
Nick