スクリプトを作成するときは、 gitブランチを使用しないでください。Gitは、スクリプトで使用するために明示的に設計された「配管」インターフェースを提供します(通常のGitコマンド(追加、チェックアウト、マージなど)の現在および過去の実装の多くは、これと同じインターフェースを使用します)。
必要な配管コマンドはgitfor-each-refです:
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
remotes/
注:参照名検索パスの複数の場所に一致する他の参照がない限り、リモート参照にプレフィックス
は必要ありません( git-rev-parseの「リビジョンの指定」セクションのorigin/master
「シンボリック参照名…」を参照)。(1))。あいまいさを明示的に回避しようとしている場合は、完全な参照名を使用してください: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)
要素の追加)と同様のことを行うことができます。