Betik yazarken git dalını kullanmamalısınız . Git bir "sıhhi tesisat" arayüzü sağlar komut dosyası oluşturmada kullanılmak üzere açıkça tasarlanmış (normal Git komutlarının (ekleme, teslim alma, birleştirme, vb.) Mevcut ve geçmiş uygulamalarının çoğu aynı arabirimi kullanır).
İstediğiniz sıhhi tesisat komutu her ref için git :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
Not: ref adı arama yolunda birden çok yerle eşleşmesine remotes/
neden origin/master
olan başka referanslarınız yoksa uzak referans üzerinde öneke ihtiyacınız yoktur (git-rev-ayrıştırmanın Revizyonları Belirtme bölümündeki "Bir sembolik referans adı. ..." konusuna bakın) (1) ). Eğer explictly karışıklıkları önlemek çalışıyorsanız, o zaman tam ref adıyla gidin: refs/remotes/origin/master
.
Şu şekilde çıktı alacaksınız:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
Bu çıktıyı sh'ye aktarabilirsiniz .
Kabuk kodunu oluşturma fikrinden hoşlanmıyorsanız, biraz sağlamlıktan * vazgeçebilir ve bunu yapabilirsiniz:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Referans isimleri, kabuğun kelime bölünmesine karşı güvenli olmalıdır (bkz. Git-check-ref-format (1) ). Şahsen ben eski sürüme bağlı kalırım (oluşturulan kabuk kodu); Bununla uygunsuz hiçbir şeyin olmayacağından daha eminim.
Bash'i belirttiğinizden ve dizileri desteklediğinden, güvenliği koruyabilir ve yine de döngünüzün özünü oluşturmaktan kaçınabilirsiniz:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
$@
Dizileri destekleyen bir kabuk kullanmıyorsanız ( öğeleri set --
başlatmak ve set -- "$@" %(refname)
eklemek için) buna benzer bir şey yapabilirsiniz .