Как получить имя текущей ветки git в переменную в оболочке script?
Я новичок в сценариях оболочки и не могу понять это. Если вы незнакомы, команда git возвращает что-то вроде
* develop
master
где звездочка отмечает текущую отмеченную ветку. Когда я запускаю в терминале следующее:
git branch | grep "*"
Я получаю:
* develop
как ожидалось.
Однако, когда я запускаю
test=$(git branch | grep "*")
или
test=`git branch | grep "*"`
И затем
echo $test
результатом является список файлов в каталоге. Как мы делаем значение test = "* develop"?
Затем следующий шаг (как только мы получим "* develop" в переменной, называемой test), нужно получить подстроку. Это будет только следующее?
currentBranch=${test:2}
Я играл с этой функцией подстроки, и у меня были ошибки "плохой замены", и я не знаю почему.
Ответы
Ответ 1
Расширяется *, вы можете использовать sed вместо grep и сразу получить имя ветки:
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
И версия с использованием git symbolic-ref, как предложила Нуфаль Ибрагим
branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
Чтобы подробно рассказать о расширении (как уже говорило marco), расширение происходит в эхо, когда вы выполняете echo $test
с $test, содержащим "* master", тогда * расширяется в соответствии с нормальными правилами расширения. Чтобы подавить это, нужно было бы указать переменную, как показано marco: echo "$test"
. В качестве альтернативы, если вы избавитесь от звездочки, прежде чем вы ее эхо, все будет хорошо, например. echo ${test:2}
будет просто эхом "master". В качестве альтернативы вы можете назначить его заново, как вы уже предложили:
branch=${test:2}
echo $branch
Это будет эхо "мастер", как вы хотели.
Ответ 2
Развернувшись на Noufal Ibrahim, используйте флаг --short
с git-symbolic-ref
, не нужно суетиться с sed
.
Я использую что-то подобное в hooks, и он работает хорошо:
#!/bin/bash
branch=$(git symbolic-ref --short HEAD)
echo
echo "**** Running post-commit hook from branch $branch"
echo
Это выводит "**** Запуск коммита после фиксации из мастера ветвления"
Обратите внимание, что git-symbolic-ref
работает только в том случае, если вы находитесь в репозитории. К счастью, .git/HEAD
, как оставшийся из Git ранних дней, содержит тот же символический реф. Если вы хотите получить активную ветвь нескольких репозиториев Git, не просматривая каталоги, вы можете использовать однострочный bash как это:
for repo in */.git; do branch=$(cat $repo/HEAD); echo ${repo%/.git} : ${branch##*/}; done
Что выводит что-то вроде:
repo1 : master
repo2 : dev
repo3 : issue12
Если вы хотите пойти дальше, полный ref, содержащийся в .git/HEAD
, также является относительным путем к файлу, содержащему хэш SHA-1 последней фиксации ветки.
Ответ 3
Я бы использовал команду git-symbolic-ref
в ядре git. Если вы скажете git-symbolic-ref HEAD
, вы получите имя текущей ветки.
Ответ 4
Я использую это
git describe --contains --all HEAD
в моих git вспомогательных скриптах
Пример:
#!/bin/bash
branchname=$(git describe --contains --all HEAD)
git pull --rebase origin $branchname
У меня есть файл в gpull
в ~/scripts
Ответ 5
Проблема основана на:
echo $test
Фактически тест переменной содержит подстановочный знак, который расширяется оболочкой. Чтобы избежать этого, просто защитите $test двойными кавычками:
echo "$test"
Ответ 6
отключить расширение глобула подлеума,
test=$(set -f; git branch)