スクリプトを作成するときは、gitブランチを使用しないでください。Gitは、スクリプトで使用するために明示的に設計された「配管」インターフェースを提供します(通常のGitコマンドの多くの現在および過去の実装(追加、チェックアウト、マージなど)は、この同じインターフェースを使用します)。
必要な配管コマンドはgit for-each-refです。
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
注:参照名検索パスの複数の場所と一致するremotes/
原因となる他の参照がない限り、リモート参照にプレフィックスは必要ありませんorigin/master
(git-rev-parseのリビジョンの指定セクションの「シンボリック参照名...」を参照)。(1))。あいまいさを明示的に避けようとしている場合は、完全なref名を使用してくださいrefs/remotes/origin/master
。
次のような出力が得られます。
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
この出力をshにパイプすることができます。
シェルコードを生成するという考えが気に入らない場合は、堅牢性を少しあきらめて*これを行うことができます。
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
*参照名はシェルの単語分割から安全でなければなりません(git-check-ref-format(1)を参照)。個人的には、以前のバージョン(生成されたシェルコード)を使用します。私はそれで不適切なことが起こり得ないことをより確信しています。
bashを指定して配列をサポートしているので、安全性を維持しながら、ループの根幹を生成することを回避できます。
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
$@
配列をサポートするシェルを使用していない場合(set --
初期化しset -- "$@" %(refname)
て要素を追加する場合)でも、同様のことができます。