Table of Contents
git で管理しているすべてのローカルブランチのうち、 リモートリポジトリをトラッキングしているものすべてについて git pull を行う方法です。
コマンド
次のコマンド(シェルスクリプト)でできます。
|
1 |
git branch -vv|sed -e 's/^s*(*|)s*//g'|awk '$3 ~ /^[/ && $4 != "gone]" {print "git checkout " $1 "; git pull"}'|sh |
コマンドの組み合わせです。 perl や ruby などのプログラミング言語を使えばもっと楽かもしれませんが、コマンドで考えてみました。 なにをやっているのか順を追って説明します。
ローカルブランチをトラッキングブランチとともに取得
git branch -vv で、 ローカルブランチとトラッキングブランチを取得します。 この結果は次のようになります。
|
1 2 3 4 5 6 |
dev_rel/20160412 b84788a [origin/dev_rel/20160412] Merge branch 'feature/deploy' into dev_rel/20160412 feature/content 21db3cd [origin/feature/content] Merge branch 'master' into feature/content feature/history b153753 [origin/feature/history] feat(log): change column name feature/ss_upload 0e94961 Merge branch 'dev_rel/20160412' of xxx into feature/ss_upload feature/test b93826f [origin/feature/test: gone] feat(test): setup test component * master 2ce6356 [origin/master] close #24 |
カレントローカルブランチには * が付いた状態で表示されます。 また、トラッキングしている場合は [ ] で囲まれてリモートブランチが表示されます。 そして、 リモートブランチが削除されている場合は gone と表示されています。 これらをうまく整形して扱います。
全ブランチのフォーマットを同じにする
カレントローカルブランチには * がついていますが、 データを取り扱う上で扱いにくいのですべてを同一のフォーマットに揃えます。
sed -e 's/^s*(*|)s*//g' がその処理を担当しています。
処理対象外の行を排除
上の結果から、処理対象外の行を取り除きます。 リモートブランチが gone になったものと、 トラッキングしていないブランチは処理対象外ですね。
awk '$3 ~ /^[/ && $4 != "gone]" ... がこの処理を担当しています。
リモートブランチをトラッキングしている場合は $3 にリモートブランチが [ から始まるテキストとして格納されます。 そこで、 [ から始まっている行のみ処理を継続します。 (コメントを[で始めた場合は排除できません。)
そして、 リモートブランチが gone になっている場合は $4 に gone] が入ります。 そこで、 $4 が gone] になっていない場合にのみ処理を継続します。 (コメントにgone]が含まれていると排除できない場合があります。)
git コマンドを出力する
awk コマンド の後半で git のコマンドを出力します。 (awk内でコマンドを実行する方法もあると思いますが、わかりませんでした。)
... '{print "git checkout " $1 "; git pull"}' の部分が該当します。 ブランチを切り替えて git pull を実行するスクリプトです。
この awk コマンド によって、 次のようなテキストが作成されます。
|
1 2 3 4 |
git checkout dev_rel/20160412; git pull git checkout feature/content; git pull git checkout feature/history; git pull git checkout master; git pull |
シェルで実行する
上でできたコマンドをシェルで実行します。 パイプでテキストをシェルに渡します。
すると、シェルで上のコマンドが実行されて、ローカルブランチでリモートブランチをトラッキングしているものすべてについて git pull が実行されます。
エイリアス作成
毎回上のコマンドをコピーして実行するのは大変ですから、 .bashrc や .zshrc などでエイリアスを設定しましょう。
bash を使う場合は .bashrc に次の記述を加えます。
|
1 |
alias gpall="git branch -vv | sed -e 's/^s*(*|)s*//g' | awk '$3 ~ /^[/ && $4 != "gone]" {print "git checkout " $1 "; git pull"}' | sh" |
こうすることで、 gpall というコマンドを実行すると、 全トラッキングブランチを pull できます。
リモートブランチの情報を取得する
もし、スクリプトの中から リモートリポジトリの名前や、 リモートブランチを取得したいというのであれば、 次のようにするとできます。
|
1 |
git branch -vv|sed -e 's/^s*(*|)s*//g'|awk '$3 ~ /^[/ && $4 != "gone]" {print $1 " " substr($3, 2, length($3) - 2)}'|sed -e 's/s([^/]*)/(.*)$/ 1 2/g' |
このスクリプトによって、次のような結果が取得できます。
|
1 2 3 4 |
dev_rel/20160412 origin dev_rel/20160412 feature/content origin feature/content feature/history origin feature/history master origin master |
もっと簡単なやり方があればぜひ教えてください。 @_kjot
ruby を使っているなら git-up という gem で全ブランチを pull できるそうですね。

