Sie sollten beim Schreiben von Skripten keinen Git-Zweig verwenden . Git bietet eine "Sanitär" -Schnittstelle , die explizit für die Verwendung in Skripten entwickelt wurde (viele aktuelle und historische Implementierungen normaler Git-Befehle (Hinzufügen, Auschecken, Zusammenführen usw.) verwenden dieselbe Schnittstelle).
Der gewünschte Installationsbefehl lautet git for-each-ref :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
Hinweis: Sie benötigen das remotes/
Präfix auf der Remote-Referenz nur, wenn Sie andere Referenzen haben, die dazu führen origin/master
, dass mehrere Stellen im Suchpfad für Referenznamen übereinstimmen (siehe „Ein symbolischer Referenzname .…“ Im Abschnitt „ Revisionen angeben“ von git-rev-parse (1) ). Wenn Sie versuchen, Mehrdeutigkeiten explizit zu vermeiden, verwenden Sie den vollständigen Referenznamen : refs/remotes/origin/master
.
Sie erhalten folgende Ausgabe:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
Sie können diese Ausgabe in sh leiten .
Wenn Ihnen die Idee, den Shell-Code zu generieren, nicht gefällt, können Sie auf Robustheit * verzichten und dies tun:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Ref-Namen sollten vor der Wortteilung der Shell geschützt sein (siehe git-check-ref-Format (1) ). Persönlich würde ich mich an die frühere Version halten (generierter Shell-Code); Ich bin zuversichtlicher, dass damit nichts Unangemessenes passieren kann.
Da Sie bash angegeben haben und es Arrays unterstützt, können Sie die Sicherheit aufrechterhalten und dennoch vermeiden, die Eingeweide Ihrer Schleife zu generieren:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
Ähnliches können Sie tun, $@
wenn Sie keine Shell verwenden, die Arrays unterstützt ( set --
zum Initialisieren und set -- "$@" %(refname)
Hinzufügen von Elementen).