Nie powinieneś używać git branch podczas pisania skryptów. Git zapewnia interfejs „hydrauliczny” który został specjalnie zaprojektowany do użycia w skryptach (wiele aktualnych i historycznych implementacji normalnych poleceń Git (dodawanie, pobieranie, scalanie itp.) Używa tego samego interfejsu).
Polecenie hydrauliczne, które chcesz, to git for-each-ref :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
Uwaga: Nie potrzebujesz remotes/
przedrostka w zdalnym odnośniku, chyba że masz inne odniesienia, które powodują origin/master
dopasowanie wielu miejsc w ścieżce wyszukiwania nazw referencyjnych (zobacz „Symboliczna nazwa odniesienia…” w sekcji Określanie wersji w git-rev-parse (1) ). Jeśli próbujesz explictly uniknąć niejasności, a następnie przejść z pełną nazwą ref: refs/remotes/origin/master
.
Otrzymasz takie wyniki:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
Możesz przesłać to wyjście do sh .
Jeśli nie podoba ci się pomysł generowania kodu powłoki, możesz porzucić trochę solidności * i zrobić to:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Nazwy ref powinny być chronione przed podziałem na słowa w powłoce (zobacz git-check-ref-format (1) ). Osobiście trzymałbym się poprzedniej wersji (wygenerowany kod powłoki); Jestem bardziej przekonany, że nie może się z tym stać nic niewłaściwego.
Ponieważ określiłeś bash i obsługuje on tablice, możesz zachować bezpieczeństwo i nadal unikać generowania wnętrzności pętli:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
Możesz zrobić coś podobnego, $@
jeśli nie używasz powłoki obsługującej tablice ( set --
do inicjalizacji i set -- "$@" %(refname)
dodawania elementów).