El * está expandido, lo que puedes hacer es usar sed en lugar de grep y obtener el nombre de la rama inmediatamente:
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
Y una versión usando gitsimbolic-ref, como lo sugiere Noufal Ibrahim
branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
Para profundizar en la expansión, (como ya lo hizo marco), la expansión ocurre en el eco, cuando haces echo $test
con $test
que contiene * master
luego el *
se expande de acuerdo con las reglas normales de expansión. Para suprimir esto, habría que citar la variable, como se muestra en marco:echo "$test"
. Alternativamente, si se deshace del asterisco antes de repetirlo, todo estará bien, p. echo ${test:2}
simplemente repetirá master
. Alternativamente, podría asignarlo de nuevo como ya propuso:
branch=${test:2}
echo $branch
Esto hará eco master
, como tú querías.
Usaría el git-symbolic-ref
comando en el núcleo de git. Si dices git-symbolic-ref HEAD
, obtendrá el nombre de la rama actual.
Ampliando la respuesta de Noufal Ibrahim, use el --short
marcar con git-symbolic-ref
, no hay necesidad de preocuparse por sed
.
He estado usando algo como esto en ganchos y funciona bien:
#!/bin/bash
branch=$(git symbolic-ref --short HEAD)
echo
echo "**** Running post-commit hook from branch $branch"
echo
Eso genera "**** Ejecutando gancho posterior a la confirmación desde el maestro de rama"
Tenga en cuenta que git-symbolic-ref
solo funciona si estás en un repositorio. Por suerte .git/HEAD
, como un remanente de los primeros días de Git, contiene la misma referencia simbólica. Si desea obtener la rama activa de varios repositorios de git, sin atravesar directorios, puede usar una sola línea de bash como esta:
for repo in */.git; do branch=$(cat $repo/HEAD); echo ${repo%/.git} : ${branch##*/}; done
Que genera algo como:
repo1 : master
repo2 : dev
repo3 : issue12
Si quiere ir más allá, la referencia completa contenida en .git/HEAD
también es una ruta relativa a un archivo que contiene el hash SHA-1 de la última confirmación de la rama.