Le * est développé, ce que vous pouvez faire est d'utiliser sed au lieu de grep et obtenir le nom de la branche immédiatement :
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
Et une version utilisant git symbolique-ref, comme suggéré par Noufal Ibrahim
branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
Pour élaborer sur l'expansion, (comme marco l'a déjà fait), l'expansion se produit dans l'écho, lorsque vous faites echo $test
avec $test
contenant * master
puis le *
est agrandie selon les règles normales d'expansion. Pour supprimer celui-ci, il faudrait citer la variable, comme indiqué par marco :echo "$test"
. Alternativement, si vous vous débarrassez de l'astérisque avant de l'écho, tout ira bien, par exemple. echo ${test:2}
fera simplement écho master
. Vous pouvez également l'attribuer à nouveau comme vous l'avez déjà proposé :
branch=${test:2}
echo $branch
Cela renverra master
, comme vous le vouliez.
J'utiliserais le git-symbolic-ref
commande dans le noyau git. Si vous dites git-symbolic-ref HEAD
, vous obtiendrez le nom de la branche actuelle.
En développant la réponse de Noufal Ibrahim, utilisez le --short
indicateur avec git-symbolic-ref
, pas besoin de s'embêter avec sed
.
J'utilise quelque chose comme ça dans les crochets et ça marche bien :
#!/bin/bash
branch=$(git symbolic-ref --short HEAD)
echo
echo "**** Running post-commit hook from branch $branch"
echo
Cela affiche "**** Running post-commit hook from branch master"
Notez que git-symbolic-ref
ne fonctionne que si vous êtes dans un référentiel. Heureusement .git/HEAD
, en tant que vestige des débuts de Git, contient la même réf symbolique. Si vous souhaitez obtenir la branche active de plusieurs dépôts git, sans traverser de répertoires, vous pouvez utiliser une ligne bash comme celle-ci :
for repo in */.git; do branch=$(cat $repo/HEAD); echo ${repo%/.git} : ${branch##*/}; done
Qui affiche quelque chose comme :
repo1 : master
repo2 : dev
repo3 : issue12
Si vous voulez aller plus loin, la ref complète contenue dans .git/HEAD
est également un chemin relatif vers un fichier contenant le hachage SHA-1 du dernier commit de la branche.