Gibt es einen besseren Weg, um herauszufinden, ob ein lokaler Git-Zweig existiert?

191

Ich verwende den folgenden Befehl, um herauszufinden, ob in meinem Repository ein lokaler Git-Zweig mit branch-namevorhanden ist. Ist das richtig? Gibt es einen besseren Weg?

Bitte beachten Sie, dass ich dies in einem Skript mache. Aus diesem Grund möchte ich nach Möglichkeit Installationsbefehle verwenden .

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 
Manoj Govindan
quelle
Ihr Befehl sieht aus wie der, den ich verwendet habe.
Paŭlo Ebermann
6
In meiner Unwissenheit wäre ich mitgegangen git branch | grep -w <branch-name>. Ok, es ist ein Porzellanbefehl, aber ich kann mir nicht vorstellen, dass sich diese spezielle Verwendung in Zukunft erheblich ändert, um dieses Snippet unbrauchbar zu machen ...
UncleZeiv
@UncleZeiv: Sie haben wahrscheinlich Recht, dass sich der Befehl nicht wesentlich ändern würde, um ihn unbrauchbar zu machen. Ich habe eine Art Zwangsstörung über solche Dinge wie Porzellan oder Klempnerarbeiten, das ist alles.
Manoj Govindan
9
git rev-parse --verify <branch_name>Überprüft auch andere Referenzen wie Tags und Commit-Hashes. Obwohl es möglicherweise besser für Ihre Anforderungen geeignet ist, werden falsch positive Ergebnisse zurückgegeben, wenn Sie nur genau an Zweigen interessiert sind.
Paul S.
2
Nur der Git-Show-Ref ermittelt, ob ein LOCAL-Zweig vorhanden ist. In der Aktualisierung (Syntax mit git rev-parse) ist der Rückkehrcode auch 0, wenn eine entfernte Verzweigung übereinstimmt.
Fabien Bouleau

Antworten:

57

Soweit ich weiß, ist dies der beste Weg, dies in einem Skript zu tun. Ich bin mir nicht sicher, ob es noch viel mehr hinzuzufügen gibt, aber es könnte genauso gut eine Antwort geben, die nur sagt "Dieser Befehl macht alles, was Sie wollen" :)

Das Einzige, worauf Sie achten sollten, ist, dass Zweignamen überraschende Zeichen enthalten können. Daher möchten Sie möglicherweise zitieren <branch-name>.

Mark Longair
quelle
1
guter Punkt zum Zitieren <branch-name>. FWIW Ich verwende dies in einem Fabric-Skript. Ich werde daran denken, die Variable zu zitieren.
Manoj Govindan
Die richtige Antwort lautet implizit: git show-ref --verify --quiet refs / Heads / <branch-name> zeigt an, dass HEAD kein korrekter Zweig ist. git rev-parse --verify teilt Ihnen mit, dass HEAD ein vorhandener Zweig ist. Falsch, weil HEAD kein Zweig ist.
Paulo Neves
106

Wenn ich in einer Suchmaschine nach "Git Check, ob Zweig vorhanden ist" suche, ist diese Seite die erste, die ich sehe.

Ich bekomme, was ich will, möchte aber eine aktualisierte Antwort geben, da der ursprüngliche Beitrag aus dem Jahr 2011 stammt.

git rev-parse --verify <branch_name>

Dies entspricht im Wesentlichen der akzeptierten Antwort, Sie müssen jedoch nicht "refs / Heads /" eingeben.

jhuynh
quelle
20
Nur eine Anmerkung: git rev-parse --verifysagt Ihnen nur, ob ein solches Objekt im Repo vorhanden ist (dh es gibt 0 für jeden Wert zurück, der <branch_name>in ein Objekt eines beliebigen Typs im Repo übersetzt wird). Es sagt Ihnen nicht, ob dieses Objekt ein Zweig ist oder nicht.
Tavnab
9
Dies ist keine korrekte Antwort auf die Frage, ob ein Zweig vorhanden ist. Dies gibt Ihnen ein falsches Positiv für ein Tag. Sie können dies leicht selbst testen. Sie benötigen Refs / Heads /, um von Tags zu unterscheiden, die sich in Refs / Tags befinden, und sogar Fernbedienungen in Refs / Remotes.
msouth
15
Git Rev-Parse - Verify Gh-Seiten gibt mir: fatal: Benötigte eine einzige Revision
SuperUberDuper
@SuperUberDuper hast du versucht: git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack
33

Fast dort.

Lass einfach das --verifyund weg--quiet Sie und Sie erhalten entweder den Hash, wenn der Zweig vorhanden ist, oder nichts, wenn dies nicht der Fall ist.

Weisen Sie es einer Variablen zu und suchen Sie nach einer leeren Zeichenfolge.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi
Martijn
quelle
10
Der Rückgabewert ist ausreichend - Sie müssen nicht die möglicherweise fehleranfällige Anstrengung durchlaufen, einer Variablen zuzuweisen.
msouth
15

Ich denke, Sie können git show-branchhier verwenden.

$ 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

Also $? == 0 würde anzeigen, dass der Zweig vorhanden ist und Sie sich überhaupt nicht mit der Installation von Refs / Heads / befassen müssen. Solange Sie nicht -ran show-branch übergeben, wird es nur in lokalen Filialen ausgeführt.

Mark Drago
quelle
5
AFAIK git show-branchist ein Porzellankommando . Wie ich in meiner Frage gesagt habe, würde ich lieber keine Porzellanbefehle in einem Skript verwenden, wenn Installationsäquivalente verfügbar sind. Siehe kernel.org/pub/software/scm/git/docs
Manoj Govindan
3
@Manoj: Ich weiß über Porzellan im Vergleich zu Sanitär, aber ich hatte nie gelesen, dass das Sanitär als stabiler als das Porzellan angesehen wurde. Vielen Dank, dass Sie mich in den Dokumenten darauf hingewiesen haben.
Mark Drago
Um zu vermeiden, dass Tags versehentlich gefunden werden, und um genauer zu bestimmen, ob der Zweig lokal oder remote ist, können Sie git show-branch refs/heads/[branch]oder angeben git show-branch refs/remotes/origin/[branch].
Twasbrillig
13

Ich empfehle git show-ref --quiet refs/heads/$name.

  • --quiet bedeutet, dass es keine Ausgabe gibt, was gut ist, da Sie dann den Exit-Status sauber überprüfen können.

  • refs/heads/$nameBeschränkungen für lokale Zweige und Übereinstimmungen mit vollständigen Namen (andernfalls devwürde dies übereinstimmen develop)

Verwendung in einem Skript:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi
Razzi Abuissa
quelle
Ja, dies ist der einzige, der es still tut. Die Benennung von Git-Befehlen ist ein bisschen verrückt tbh
smac89
10

Zur Verwendung in einem Skript:

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

Dies wird 0nur dann beendet, wenn <branch-name>es sich um einen lokalen Zweig handelt.

Beispiel:

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

Im Windows-Batch-Skript ist das etwas anders.

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)
Pinkal Vansia
quelle
2

Ja, da ist einer.

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

Unter https://git-scm.com/docs/git-rev-parse finden Sie die Argumente und die Funktion.

git rev-parse --verify <branch-name>
Benjamin W.
quelle
1

Nennen wir es git is_localbranch(Sie müssen einen Alias ​​hinzufügen .gitconfig).

Verwendung:

$ git is_localbranch BRANCH

Quelle:

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

quelle
1

Das Ergebnis der Überprüfung meiner 'Vorgeschlagenen Änderung' des 'Updates' bei der ersten Frage war 'Es sollte als Kommentar oder Antwort geschrieben worden sein', daher poste ich es hier:

Der andere vorgeschlagene Weg überprüft nicht nur Zweige, sondern auch Verweise mit dem Namen @jhuynh .

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

Problem mit einem 'Update' bei der ersten Frage erklärt:

Nehmen wir an und überprüfen Sie, ob 'master.000' nur ein Tag ist. Ein solcher lokaler Zweig existiert nicht. Grep gibt einen Eintrag zurück, der ein Tag ist. Trotzdem gibt rev-parse 0 zurück, wenn eine Referenz vorhanden ist, auch wenn eine solche lokale Verzweigung nicht vorhanden ist. Dies ist eine falsche Übereinstimmung, genau wie von @ paul-s erwähnt

$ git show-ref |grep master.000

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

Weder git show-refnoch git rev-parsearbeitet an meinem Fall.

$ 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

Ich bin damit gelandet

$ 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

Sie können auch mit einer Skriptdatei arbeiten

#!/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
quelle
-1

Wenn Sie es schaffen, grep einzuschließen.

git branch | grep -q <branch>
Daniel Vikström
quelle
1
Das kann zu einer falschen Antwort führen, wenn Sie Punkte (".") In Zweignamen verwenden, wie ich es manchmal tue, da der Punkt grepals Metazeichen interpretiert wird .
Peter John Acklam
1
Sie erhalten auch ein falsches Positiv, wenn Sie nach einem Zweig testen, dessen Name ein Teilstring eines echten Zweigs ist. zB abcstimmt überein, wenn ein Zweig aufgerufen wird abcdef.
rjmunro
-1

Zur Verwendung in einem Skript empfehle ich den folgenden Befehl:

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

Beachten Sie, dass <repo_url>dies nur ein "." Sein kann. Geben Sie das lokale Repo an, wenn Sie sich in seiner Verzeichnisstruktur befinden, den Pfad zu einem lokalen Repo oder die Adresse eines Remote-Repos.

Der Befehl gibt eine 0 zurück, wenn die <branch_name>nicht vorhanden ist, und eine 1, falls vorhanden.

David
quelle
-1
git branch --list $branch_name | grep $branch_name

Überprüfen Sie dann, ob der Rückgabewert 0 oder 1 ist.

Howell ZHU
quelle