Table of Contents
git で管理しているすべてのローカルブランチのうち、 リモートリポジトリをトラッキングしているものすべてについて git pull
を行う方法です。
コマンド
次のコマンド(シェルスクリプト)でできます。
コマンドの組み合わせです。 perl や ruby などのプログラミング言語を使えばもっと楽かもしれませんが、コマンドで考えてみました。 なにをやっているのか順を追って説明します。
ローカルブランチをトラッキングブランチとともに取得
git branch -vv
で、 ローカルブランチとトラッキングブランチを取得します。 この結果は次のようになります。
カレントローカルブランチには *
が付いた状態で表示されます。 また、トラッキングしている場合は [ ] で囲まれてリモートブランチが表示されます。 そして、 リモートブランチが削除されている場合は 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
コマンド によって、 次のようなテキストが作成されます。
シェルで実行する
上でできたコマンドをシェルで実行します。 パイプでテキストをシェルに渡します。
すると、シェルで上のコマンドが実行されて、ローカルブランチでリモートブランチをトラッキングしているものすべてについて git pull
が実行されます。
エイリアス作成
毎回上のコマンドをコピーして実行するのは大変ですから、 .bashrc
や .zshrc
などでエイリアスを設定しましょう。
bash を使う場合は .bashrc
に次の記述を加えます。
こうすることで、 gpall
というコマンドを実行すると、 全トラッキングブランチを pull できます。
リモートブランチの情報を取得する
もし、スクリプトの中から リモートリポジトリの名前や、 リモートブランチを取得したいというのであれば、 次のようにするとできます。
このスクリプトによって、次のような結果が取得できます。
もっと簡単なやり方があればぜひ教えてください。 @_kjot
ruby を使っているなら git-up
という gem で全ブランチを pull できるそうですね。