Чи є кращий спосіб з’ясувати, чи існує місцева гілка git?


191

Я використовую наступну команду, щоб з'ясувати, чи існує локальне відділення 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: Ви, мабуть, праві, що команда не зміниться суттєво, щоб зробити її непридатною. У мене є трохи OCD про такі речі, як порцеляна проти сантехніки, ось і все.
Маной Говіндан

10
git rev-parse --verify <branch_name>перевіряє також інші посилання, такі як теги та введення хешей, тому, хоча це може бути більш підходящим для того, що вам потрібно, воно поверне помилкові позитиви, якщо вас цікавлять лише саме галузі.
Пол С.

2
Лише git show-ref працює, щоб визначити, чи є гілка LOCAL. У оновленні (синтаксис з git rev-parse) код повернення також дорівнює 0, якщо віддалена гілка збігається.
Fabien Bouleau

Відповіді:


57

Наскільки я знаю, це найкращий спосіб зробити це за сценарієм. Я не впевнений, що до цього можна додати ще багато, але може бути одна відповідь, яка просто говорить: "Ця команда робить все, що ви хочете" :)

Єдине, на що ви хочете бути обережними - це те, що назви гілок можуть містити в собі дивовижні символи, тому ви, можливо, захочете цитувати <branch-name>.


1
хороший момент щодо цитування <branch-name>. FWIW Я використовую це в сценарії тканини. Я згадаю процитувати змінну.
Маной Говіндан

Правильна відповідь така: git rev-parse - verify скаже, що HEAD - це вже існуюча галузь. Неправдиво, тому що HEAD - це не галузь.
Пауло Невес

106

Коли я шукаю 'git check, чи існує відділення' в пошуковій системі, ця сторінка є першою, яку я бачу.

Я отримую те, що хочу, але хотів би надати оновлену відповідь, оскільки початкова публікація була з 2011 року.

git rev-parse --verify <branch_name>

Це по суті те саме, що прийнята відповідь, але вам не потрібно вводити "refs / heads /"


20
Лише зауваження: git rev-parse --verifyповідомляє лише про те, чи існує такий об'єкт у репо (тобто він поверне 0 за будь-яке значення, <branch_name>що перекладається на об'єкт будь-якого типу в репо). Це не говорить вам, чи є цей об’єкт гілкою чи ні.
tavnab

9
Це не правильна відповідь на запитання, яке запитує, як знати, чи існує філія. Це дасть помилковий позитив для тегу. Ви можете легко перевірити це самостійно. Вам потрібно refs / heads /, щоб відрізнити теги, які містяться в refs / тегах, і навіть віддалені в refs / Remote.
msouth

15
git rev-parse - підтвердити gh-сторінки дає мені: фатально: Потрібна одноразова редакція
SuperUberDuper

@SuperUberDuper Ви пробували: git rev-parse --перевірити ** походження / ** gh-сторінки?
RoyalBigMack

32

Майже там.

Просто залиште --verifyі, --quietі ви отримаєте або хеш, якщо гілка існує, або нічого, якщо його немає.

Призначте його змінній і перевірте, чи є порожній рядок.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi

10
Повернене значення є достатнім - вам не потрібно проходити можливі зусилля, пов'язані з помилками присвоєння змінної.
msouth

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до шоу-філії, він працюватиме лише на місцевих відділеннях.


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

Але це єдиний, хто робить це мовчки.
Називання

11

Для використання в сценарії:

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

Це вийде, 0якщо і лише тоді, коли <branch-name>існує локальна гілка.

Приклад:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi


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-синтаксис поверне 0, якщо існує посилання, навіть якщо такої локальної гілки немає. Це помилкова відповідність, саме так, як згадує @ paul-s

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0



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

-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
git branch --list $branch_name | grep $branch_name

потім перевірте значення повернення 0 або 1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.