Есть ли лучший способ узнать, существует ли локальная ветка git?

192

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

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

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 
Маной Говиндан
источник
Ваша команда выглядит как та, которую я использовал.
Paŭlo Ebermann
6
По моему невежеству я бы пошел с git branch | grep -w <branch-name>. Хорошо, это фарфоровая команда, но я не могу себе представить, что это конкретное использование будет существенно изменено в будущем, чтобы сделать этот фрагмент непригодным для использования ...
UncleZeiv
@UncleZeiv: Вы, вероятно, правы, что команда существенно не изменится, чтобы сделать ее непригодной для использования. У меня есть немного ОКР о таких вещах, как фарфор против сантехники, вот и все.
Маной Говиндан
10
git rev-parse --verify <branch_name>проверяет также другие ссылки, такие как теги и хеши коммитов, поэтому, хотя он может быть более подходящим для того, что вам нужно, он вернет ложные срабатывания, если вас интересуют только именно ветки.
Пол С.
2
Только git show-ref работает, чтобы определить, присутствует ли ЛОКАЛЬНАЯ ветвь. В обновлении (синтаксис с git rev-parse) код возврата также равен 0, если удаленная ветвь соответствует.
Fabien

Ответы:

57

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

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

Марк Лонгэйр
источник
1
хороший момент о цитировании <branch-name>. FWIW Я использую это в сценарии ткани. Я не забуду процитировать переменную.
Маной Говиндан
Правильный ответ это неявно: git show-ref --verify --quiet refs / head / <имя-ветви> покажет, что HEAD не является ветвью правильно. git rev-parse --verify скажет вам, что HEAD - это существующая ветка. Ложь, потому что ГОЛОВА не ветвь.
Пауло Невес
106

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

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

git rev-parse --verify <branch_name>

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

jhuynh
источник
20
Только примечание: git rev-parse --verifyтолько говорит вам, если такой объект существует в репо (то есть он вернет 0 для любого значения, <branch_name>которое переводится в объект любого типа в репо). Он не говорит вам, является ли этот объект ветвью или нет.
Тавнаб
9
Это не правильный ответ на вопрос, который спрашивает, как узнать, существует ли ветвь. Это даст вам ложное срабатывание для тега. Вы можете легко проверить это самостоятельно. Вам нужны ссылки / заголовки /, чтобы отличать теги, которые есть в ссылках / тегах, и даже пульты в ссылках / пультах.
Мсут
15
git rev-parse --verify gh-pages дает мне: fatal:
Нужна
@SuperUberDuper Вы пробовали: git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack
32

Почти готово.

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

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

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi
Мартейн
источник
10
Возвращаемое значение является достаточным - вам не нужно проходить через возможную ошибку присвоения переменной.
Мсут
15

Я думаю, что вы можете использовать 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, он будет работать только на локальных ветках.

Марк Драго
источник
5
AFAIK git show-branch- это фарфоровая команда. Как я уже сказал в своем вопросе, я бы предпочел не использовать фарфоровые команды в сценарии, если доступны сантехнические эквиваленты. См. Kernel.org/pub/software/scm/git/docs
Маной Говиндан,
3
@Manoj: Я знаю о фарфоре и сантехнике, но я никогда не читал, что сантехника считалась более стабильной, чем фарфор. Спасибо за указание на это в документации.
Марк Драго
Чтобы избежать нахождения тегов по ошибке и более точно определить, является ли ветвь локальной или удаленной, вы можете указать git show-branch refs/heads/[branch]или git show-branch refs/remotes/origin/[branch].
twasbrillig
14

Я рекомендую 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
Раззи Абуисса
источник
Да, это единственный, кто делает это молча. Именование git-команд немного
странно
11

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

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

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

Пример:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi
Том Хейл
источник
2

На пакетном сценарии Windows это немного отличается,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)
Pinkal Vansia
источник
1

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

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

$ git is_localbranch BRANCH

Источник:

git branch | grep -w $1 > /dev/null
if [ $? = 0 ]
then
  echo "branch exists"
fi

источник
1

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

Другой способ предложил не только проверить ветви , но все ссылки с таким именем @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
Pshemy108
источник
1
git show-branch <BRANCH-NAME> &>/dev/null && echo yes || echo no
Войтех Витек
источник
1

Да, есть один.

git rev-parse [<options>] <args>…​

См. Https://git-scm.com/docs/git-rev-parse, где вы можете найти набор аргументов и функцию.

git rev-parse --verify <branch-name>
Бенджамин В.
источник
0

Ни то, git show-refни другое не git rev-parseработает в моем случае.

$ git --version
git version 2.21.0

$ git show-branch --list
* [master] mybranch commit

$ BRANCH_NAME=mybranch
$ git rev-parse --verify $BRANCH_NAME
fatal: Needed a single revision

$ git show-ref refs/heads/$BRANCH_NAME
<no otput>
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch not exists

Я закончил с этим

$ BRANCH_NAME=mybranch
$ SHOW_ALL=`git show-branch --all | grep -w $BRANCH_NAME`
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch exists

Вы также можете сделать с файлом сценария

#!/bin/sh
BRANCH_NAME=mybranch
if grep -Fqe $BRANCH_NAME << EOF
`git show-branch --all`
EOF
then
   echo "$BRANCH_NAME exists"
else
   echo "$BRANCH_NAME not exists"
fi
Chetabahana
источник
-1

Если вам удастся включить grep.

git branch | grep -q <branch>
Даниэль Викстрем
источник
1
Это может дать вам неправильный ответ, если вы используете точки (".") В именах ветвей, как я иногда это делаю, поскольку точка интерпретируется grepкак метасимвол.
Питер Джон Аклам
1
Вы также получите ложное срабатывание, если будете проверять ветку, имя которой является подстрокой реальной ветки. Например, abcбудет соответствовать, если есть ответвление abcdef.
Rjmunro
-1

Для использования в скрипте я рекомендую следующую команду:

git ls-remote --heads <repo_url> "<branch_name>" | wc -l

Обратите внимание, что это <repo_url>может быть просто "." указать локальное репо, если вы находитесь внутри его структуры каталогов, пути к локальному репо или адреса удаленного репо.

Команда возвращает 0, если <branch_name>нет, 1, если присутствует.

Дэвид
источник
-1
git branch --list $branch_name | grep $branch_name

затем проверьте возвращаемое значение 0 или 1.

Хауэлл ЖУ
источник