Подтвердить что ты не робот

Как получить имя текущей ветки 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} 

Я играл с этой функцией подстроки, и у меня были ошибки "плохой замены", и я не знаю почему.

4b9b3361

Ответ 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)