Есть ли лучший способ узнать, существует ли локальная ветка git? - PullRequest
159 голосов
/ 02 марта 2011

Я использую следующую команду, чтобы узнать, существует ли в моем хранилище ветка local git с branch-name.Это правильно?Есть ли лучший способ?

Обратите внимание, что я делаю это внутри скрипта.По этой причине я хотел бы держаться подальше от фарфоровых команд, если это возможно.

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 

Обновление

Оказывается, есть другой путь .Спасибо @ jhuynh .

git rev-parse --verify <branch-name>
# $? == 0 means local branch with name <branch-name> exists.

Ответы [ 15 ]

95 голосов
/ 28 февраля 2015

Когда я ищу 'git check, если ветвь существует' в поисковой системе, эта страница является первой, которую я вижу.

Я получаю то, что хочу, но я хотел бы предоставить обновленный ответпоскольку исходное сообщение было с 2011 года.

git rev-parse --verify <branch_name>

По сути, это то же самое, что и принятый ответ, но вам не нужно вводить "refs /heads /"

45 голосов
/ 02 марта 2011

Насколько я знаю, это лучший способ сделать это в скрипте.Я не уверен, что есть еще что-то, что можно добавить к этому, но может быть и один ответ, который просто говорит: «Эта команда делает все, что вы хотите»:)

Единственное, к чему вы можете быть осторожныв том, что имена веток могут содержать удивительные символы, поэтому вы можете заключить в кавычки <branch-name>.

29 голосов
/ 11 июня 2013

Почти там.

Просто пропустите --verify и --quiet, и вы получите либо хеш, если ветвь существует, либо ничего, если ее нет.

Назначьте ее переменной и проверьте наличие пустой строки.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi
15 голосов
/ 02 марта 2011

Я думаю, вы можете использовать git show-branch здесь.

$ git show-branch --list
  [master] test
* [testbranch] test
$ git show-branch testbranch
[testbranch] test
$ echo $?
0
$ git show-branch nonexistantbranch
fatal: bad sha1 reference nonexistantbranch
$ echo $?
128

Итак, $?== 0 будет означать, что ветвь существует, и вам вообще не нужно копаться в канализационных ссылках / заголовках /.Пока вы не передадите -r в show-branch, он будет работать только на локальных ветвях.

12 голосов
/ 02 февраля 2017

Я рекомендую git show-ref --quiet refs/heads/$name.

  • --quiet означает, что нет выхода, что хорошо, потому что тогда вы можете точно проверить состояние выхода.

  • refs/heads/$name ограничивает локальные ветви и соответствует полным именам (в противном случае dev будет соответствовать develop)

Использование в скрипте:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi
4 голосов
/ 14 сентября 2018

Для использования в сценарии:

git show-ref -q --heads <branch-name>

Это приведет к выходу 0, если и только если <branch-name> существует как локальная ветвь.

Пример:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi
2 голосов
/ 10 марта 2016

В пакетном скрипте Windows он немного другой,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)
1 голос
/ 02 марта 2017

Результатом проверки моего «Предложенного изменения» на «Обновление» по первому вопросу было «Это должно было быть написано как комментарий или ответ», поэтому я публикую его здесь:

Другой предложенный способ будет проверять не только ветки, но и любые ссылки с таким именем @ jhuynh .

git rev-parse --verify <reference-name>
# $? == 0 means reference with <reference-name> exists.

Проблема с «Обновлением» при первоначальном объяснении вопроса:

Предположим и проверили, что «master.000» является только тегом, такая локальная ветвь не существует, grep возвращаетодна запись, которая является тегом.Тем не менее, rev-parse вернет 0, если ссылка существует, даже если такая локальная ветвь не существует.Это ложное совпадение, в точности как упомянуто @ paul-s

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0
1 голос
/ 12 января 2014

Давайте назовем это git is_localbranch (необходимо добавить псевдоним в .gitconfig).

Использование:

$ git is_localbranch BRANCH

Источник:

git branch | grep -w $1 > /dev/null
if [ $? = 0 ]
then
  echo "branch exists"
fi
0 голосов
/ 30 июня 2019

да есть один. git rev-parse []… https://git -scm.com / документы / ГИТ-преподобным синтаксический анализ Где вы можете найти множество аргументов и функции.

        git rev-parse --verify <branch-name>
...