* je rozšířeno, můžete použít sed místo grep a okamžitě získat název větve:
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
A verze používající git symbolic-ref, jak navrhuje Noufal Ibrahim
branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
Abychom rozbalení upřesnili, (jak už to udělal Marco), rozšíření se děje v echu, když uděláte echo $test
s $test
obsahující * master
pak *
se rozšiřuje podle normálních pravidel rozšiřování. Abychom to potlačili, museli bychom uvádět proměnnou, jak ukazuje marco:echo "$test"
. Případně, když se hvězdičky zbavíte, než ji ozvěte, bude vše v pořádku, např. echo ${test:2}
bude pouze echo master
. Případně jej můžete přiřadit znovu, jak jste již navrhli:
branch=${test:2}
echo $branch
To bude echo master
, jak jste chtěli.
Použil bych git-symbolic-ref
příkaz v jádře git. Řeknete-li git-symbolic-ref HEAD
, získáte název aktuální pobočky.
Pro rozšíření odpovědi Noufala Ibrahima použijte --short
příznak s git-symbolic-ref
, není třeba se trápit s sed
.
Něco takového jsem v hácích používal a funguje to dobře:
#!/bin/bash
branch=$(git symbolic-ref --short HEAD)
echo
echo "**** Running post-commit hook from branch $branch"
echo
To vypíše "**** Running post-commit hook from branch master"
Všimněte si, že git-symbolic-ref
funguje pouze v případě, že jste v úložišti. Naštěstí .git/HEAD
, jako pozůstatek z počátků Gitu, obsahuje stejné symbolické ref. Pokud chcete získat aktivní větev několika git repozitářů bez procházení adresářů, můžete použít bash one-liner takto:
for repo in */.git; do branch=$(cat $repo/HEAD); echo ${repo%/.git} : ${branch##*/}; done
Výsledkem je něco jako:
repo1 : master
repo2 : dev
repo3 : issue12
Pokud chcete jít dále, celý ref obsažený v .git/HEAD
je také relativní cesta k souboru obsahujícímu hash SHA-1 posledního potvrzení větve.