git-svn を使っているとき、すべてのブランチに対して git svn rebase をしたいと思った。
方法1
以下のコマンドで、ブランチのリストを取得できる。
git for-each-ref --format='%(refname:short)' refs/heads
これを使ってシェルスクリプトを書くことができる。
git svn fetch
for branch in $(git for-each-ref --format='%(refname:short)' refs/heads); do
git checkout $branch && git svn rebase --local
done
方法2
git for-each-ref の出力をパイプで直接 sh に渡してしまう方法もある。
git svn fetch
git for-each-ref --format='git checkout %(refname:short) && git svn rebase --local' refs/heads | sh
補足
ブランチのリストを取得して何か処理する、といった場合は、git branch でなく git for-each-ref を使うほうがいいようだ。
git branch は hidh-level commands (porcelain) であり、シェル上で対話的に使うことを想定している。だから、現在のブランチにマークがついていたりする。
git for-each-ref は low-level commands (plumbing) であり、スクリプトで使うのに向いている。だから、普段シェル上でコマンドを打つときはちょっと使いにくいけど、format 指定ができたりして応用がきく。