目次
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 できるそうですね。