Git: ローカルにあるすべてのブランチでトラッキングをしているものについて git pull を実行する


git で管理しているすべてのローカルブランチのうち、 リモートリポジトリをトラッキングしているものすべてについて git pull を行う方法です。

コマンド

次のコマンド(シェルスクリプト)でできます。

コマンドの組み合わせです。 perl や ruby などのプログラミング言語を使えばもっと楽かもしれませんが、コマンドで考えてみました。 なにをやっているのか順を追って説明します。

ローカルブランチをトラッキングブランチとともに取得

git branch -vv で、 ローカルブランチとトラッキングブランチを取得します。 この結果は次のようになります。

カレントローカルブランチには * が付いた状態で表示されます。 また、トラッキングしている場合は [ ] で囲まれてリモートブランチが表示されます。 そして、 リモートブランチが削除されている場合は gone と表示されています。 これらをうまく整形して扱います。

全ブランチのフォーマットを同じにする

カレントローカルブランチには * がついていますが、 データを取り扱う上で扱いにくいのですべてを同一のフォーマットに揃えます。

sed -e 's/^s*(*|)s*//g' がその処理を担当しています。

処理対象外の行を排除

上の結果から、処理対象外の行を取り除きます。 リモートブランチが gone になったものと、 トラッキングしていないブランチは処理対象外ですね。

awk '$3 ~ /^[/ && $4 != "gone]" ... がこの処理を担当しています。

リモートブランチをトラッキングしている場合は $3 にリモートブランチが [ から始まるテキストとして格納されます。 そこで、 [ から始まっている行のみ処理を継続します。 (コメントを[で始めた場合は排除できません。)

そして、 リモートブランチが gone になっている場合は $4gone] が入ります。 そこで、 $4gone] になっていない場合にのみ処理を継続します。 (コメントにgone]が含まれていると排除できない場合があります。)

git コマンドを出力する

awk コマンド の後半で git のコマンドを出力します。 (awk内でコマンドを実行する方法もあると思いますが、わかりませんでした。)

... '{print "git checkout " $1 "; git pull"}' の部分が該当します。 ブランチを切り替えて git pull を実行するスクリプトです。

この awk コマンド によって、 次のようなテキストが作成されます。

シェルで実行する

上でできたコマンドをシェルで実行します。 パイプでテキストをシェルに渡します。

すると、シェルで上のコマンドが実行されて、ローカルブランチでリモートブランチをトラッキングしているものすべてについて git pull が実行されます。

エイリアス作成

毎回上のコマンドをコピーして実行するのは大変ですから、 .bashrc.zshrc などでエイリアスを設定しましょう。

bash を使う場合は .bashrc に次の記述を加えます。

こうすることで、 gpall というコマンドを実行すると、 全トラッキングブランチを pull できます。

リモートブランチの情報を取得する

もし、スクリプトの中から リモートリポジトリの名前や、 リモートブランチを取得したいというのであれば、 次のようにするとできます。

このスクリプトによって、次のような結果が取得できます。

もっと簡単なやり方があればぜひ教えてください。 @_kjot

ruby を使っているなら git-up という gem で全ブランチを pull できるそうですね。