Il * è espanso, quello che puoi fare è usare sed invece di grep e ottenere immediatamente il nome del ramo:
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
E una versione che utilizza git simbolico-ref, come suggerito da Noufal Ibrahim
branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
Per approfondire l'espansione, (come ha già fatto marco) l'espansione avviene nell'eco, quando si fa echo $test
con $test
contenente * master
poi il *
viene espanso secondo le normali regole di espansione. Per sopprimere questo si dovrebbe citare la variabile, come mostrato da marco:echo "$test"
. In alternativa, se elimini l'asterisco prima di ripeterlo, andrà tutto bene, ad es. echo ${test:2}
echeggerà solo master
. In alternativa puoi assegnarlo di nuovo come hai già proposto:
branch=${test:2}
echo $branch
Questo farà eco a master
, come volevi.
Userei git-symbolic-ref
comando nel core git. Se dici git-symbolic-ref HEAD
, otterrai il nome del ramo corrente.
Espandendo la risposta di Noufal Ibrahim, usa --short
flag con git-symbolic-ref
, non c'è bisogno di agitarsi con sed
.
Sto usando qualcosa di simile negli hook e funziona bene:
#!/bin/bash
branch=$(git symbolic-ref --short HEAD)
echo
echo "**** Running post-commit hook from branch $branch"
echo
Viene visualizzato "**** Running post-commit hook from branch master"
Nota che git-symbolic-ref
funziona solo se sei in un repository. Fortunatamente .git/HEAD
, come residuo dei primi giorni di Git, contiene lo stesso riferimento simbolico. Se vuoi ottenere il ramo attivo di diversi repository git, senza attraversare le directory, puoi usare un one-liner bash come questo:
for repo in */.git; do branch=$(cat $repo/HEAD); echo ${repo%/.git} : ${branch##*/}; done
Che produce qualcosa come:
repo1 : master
repo2 : dev
repo3 : issue12
Se vuoi andare oltre, il riferimento completo contenuto in .git/HEAD
è anche un percorso relativo a un file contenente l'hash SHA-1 dell'ultimo commit del ramo.