Czy istnieje lepszy sposób, aby dowiedzieć się, czy istnieje lokalna gałąź git?

191

Używam następującego polecenia, aby dowiedzieć się, czy lokalna gałąź git branch-nameistnieje w moim repozytorium. Czy to jest poprawne? Czy jest lepszy sposób?

Pamiętaj, że robię to w skrypcie. Z tego powodu chciałbym użyć poleceń hydraulicznych, jeśli to możliwe.

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 
Manoj Govindan
źródło
Twoje polecenie wygląda jak to, którego użyłem.
Paŭlo Ebermann
6
W mojej ignorancji poszedłbym z tym git branch | grep -w <branch-name>. Ok, to polecenie z porcelany, ale nie wyobrażam sobie, aby ten konkretny sposób mógł ulec znacznej zmianie w przyszłości, aby uczynić ten fragment bezużytecznym ...
UncleZeiv
@UncleZeiv: Prawdopodobnie masz rację, że polecenie nie zmieni się znacząco, aby uczynić go bezużytecznym. Mam trochę OCD na temat takich rzeczy jak porcelana kontra hydraulika, to wszystko.
Manoj Govindan
10
git rev-parse --verify <branch_name>weryfikuje również inne odwołania, takie jak tagi i zatwierdzanie skrótów, więc chociaż może być bardziej odpowiednie dla tego, czego potrzebujesz, zwróci fałszywie dodatnie, jeśli jesteś zainteresowany tylko gałęziami.
Paul S.
2
Tylko git show-ref działa, aby ustalić, czy gałąź LOCAL jest obecna. W aktualizacji (składnia z git rev-pars) kod powrotu ma również wartość 0, jeśli gałąź zdalna jest zgodna.
Fabien Bouleau,

Odpowiedzi:

57

O ile mi wiadomo, to najlepszy sposób, aby to zrobić w skrypcie. Nie jestem pewien, czy można dodać do tego znacznie więcej, ale równie dobrze może istnieć jedna odpowiedź, która mówi tylko: „To polecenie robi wszystko, co chcesz” :)

Jedyną rzeczą, na którą możesz uważać, jest to, że nazwy gałęzi mogą zawierać zaskakujące znaki, więc możesz zacytować <branch-name>.

Mark Longair
źródło
1
dobra uwaga na temat cytowania <branch-name>. FWIW Używam tego w skrypcie tekstylnym. Będę pamiętać, aby zacytować zmienną.
Manoj Govindan
Prawidłowa odpowiedź brzmi: niejawnie: git show-ref --verify --quiet refs / heads / <nazwa-gałęzienia> pokaże, że HEAD nie jest gałęzią poprawnie. git rev-parse --verify powie ci, że HEAD jest istniejącą gałęzią. Fałsz, ponieważ HEAD nie jest oddziałem.
Paulo Neves,
106

Kiedy szukam w wyszukiwarce hasła „sprawdź, czy gałąź istnieje”, ta strona jest pierwszą, którą widzę.

Dostaję to, czego chcę, ale chciałbym udzielić zaktualizowanej odpowiedzi, ponieważ oryginalny post pochodzi z 2011 roku.

git rev-parse --verify <branch_name>

Jest to zasadniczo to samo co zaakceptowana odpowiedź, ale nie trzeba wpisywać „refs / heads /”

jhuynh
źródło
20
Tylko uwaga: git rev-parse --verifyinformuje tylko, czy taki obiekt istnieje w repozytorium (tzn. Zwróci 0 dla dowolnej wartości, <branch_name>która przekłada się na obiekt dowolnego typu w repo). Nie mówi ci, czy ten obiekt jest gałęzią, czy nie.
tavnab
9
To nie jest poprawna odpowiedź na pytanie, które pyta, jak się dowiedzieć, czy gałąź istnieje. To da ci fałszywy wynik pozytywny dla tagu. Możesz to łatwo przetestować samodzielnie. Potrzebujesz refs / heads /, aby odróżnić tagi znajdujące się w ref / tagi, a nawet piloty w ref / pilocie.
msouth
15
git rev-parse - zweryfikuj gh-pages daje mi: fatal: Potrzebowałem jednej rewizji
SuperUberDuper
@SuperUberDuper próbowałeś: git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack,
32

Prawie na miejscu.

Wystarczy pominąć --verifya --quieti dostać albo hash jeśli oddział istnieje lub nic, jeśli tak nie jest.

Przypisz ją do zmiennej i sprawdź, czy jest pusty ciąg.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi
Martijn
źródło
10
Zwracana wartość jest wystarczająca - nie trzeba przechodzić przez potencjalnie podatny na błędy wysiłek przypisania do zmiennej.
msouth
15

Myślę, że możesz użyć git show-branchtutaj.

$ 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

Więc $? == 0 oznaczałoby, że gałąź istnieje i nie musisz w ogóle logować się w instalacjach refs / heads /. Dopóki nie przejdziesz -rdo gałęzi show, będzie ona działać tylko w lokalnych oddziałach.

Mark Drago
źródło
5
AFAIK git show-branchto porcelana . Jak powiedziałem w moim pytaniu, wolałbym nie używać porcelanowych poleceń w skrypcie, jeśli dostępne są ekwiwalenty hydrauliczne. Zobacz kernel.org/pub/software/scm/git/docs
Manoj Govindan
3
@Manoj: Wiem o porcelanie vs. hydraulice, ale nigdy nie czytałem, że hydraulika była uważana za bardziej stabilną niż porcelana. Dzięki za wskazanie mi tego w dokumentacji.
Mark Drago,
Aby uniknąć przypadkowego znalezienia tagów i dokładniej określić, czy oddział jest lokalny czy zdalny, możesz określić git show-branch refs/heads/[branch]lub git show-branch refs/remotes/origin/[branch].
twasbrillig
14

Polecam git show-ref --quiet refs/heads/$name.

  • --quiet oznacza, że ​​nie ma danych wyjściowych, co jest dobre, ponieważ wtedy można dokładnie sprawdzić status wyjścia.

  • refs/heads/$namelimity do lokalnych oddziałów i dopasowuje pełne nazwy (w przeciwnym devrazie pasowałyby develop)

Użycie w skrypcie:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi
Razzi Abuissa
źródło
Tak, to jedyny, który robi to po cichu. Nazywanie komend git jest trochę zbędne
smac89
11

Do użycia w skrypcie:

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

Wyjdzie to 0wtedy i tylko wtedy <branch-name>, gdy istnieje jako oddział lokalny.

Przykład:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi
Tom Hale
źródło
2

W skrypcie wsadowym systemu Windows jest nieco inaczej,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)
pinkal vansia
źródło
1

Nazwijmy to git is_localbranch(musisz dodać alias .gitconfig).

Stosowanie:

$ git is_localbranch BRANCH

Źródło:

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

źródło
1

Wynik przeglądu mojej „Sugerowanej edycji” do „Aktualizacji” w początkowym pytaniu brzmiał: „Powinien być napisany jako komentarz lub odpowiedź”, więc zamieszczam go tutaj:

Drugi zaproponowany sposób nie tylko zweryfikuje gałęzie, ale wszelkie odniesienia o takiej nazwie @jhuynh .

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

Wyjaśnienie problemu z „aktualizacją” pierwszego pytania:

Załóżmy i sprawdźmy, że „master.000” jest tylko znacznikiem, taka lokalna gałąź nie istnieje, grep zwraca jeden wpis, który jest znacznikiem. Nadal analiza składni zwróci 0, jeśli istnieje odwołanie, nawet jeśli taka lokalna gałąź nie istnieje. To jest fałszywe dopasowanie, dokładnie tak jak wspomniano w @ paul-s

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0
Pshemy108
źródło
1
git show-branch <BRANCH-NAME> &>/dev/null && echo yes || echo no
Vojtech Vitek
źródło
0

Ani git show-refnie git rev-parsedziała w mojej sprawie.

$ 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

Skończyło się na tym

$ 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

Możesz to zrobić również za pomocą pliku skryptu

#!/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
źródło
-1

Jeśli potrafisz dołączyć grep.

git branch | grep -q <branch>
Daniel Vikström
źródło
1
To może dać złą odpowiedź, jeśli użyjesz kropek („.”) W nazwach gałęzi, tak jak ja czasami, ponieważ kropka jest interpretowana grepjako metaznak.
Peter John Acklam,
1
Otrzymasz również wynik fałszywie dodatni, jeśli przetestujesz gałąź, której nazwa jest podciągiem prawdziwej gałęzi. np. abcdopasuje, jeśli istnieje gałąź o nazwie abcdef.
rjmunro
-1

Do użycia w skrypcie polecam następujące polecenie:

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

Pamiętaj, że <repo_url>może to być po prostu „.” aby określić repozytorium lokalne, jeśli znajdujesz się w jego strukturze katalogów, ścieżce do repozytorium lokalnego lub adresie repozytorium zdalnego.

Polecenie zwraca 0, jeśli <branch_name>nie ma wartości 1, jeśli występuje.

David
źródło
-1
git branch --list $branch_name | grep $branch_name

następnie sprawdź, czy zwracana wartość to 0 lub 1.

Howell ZHU
źródło