Existe-t-il un meilleur moyen de savoir si une branche git locale existe?

195

J'utilise la commande suivante pour savoir si une branche git localebranch-name existe dans mon référentiel. Est-ce correct? Y a-t-il un meilleur moyen?

Veuillez noter que je fais cela dans un script. Pour cette raison, j'aimerais utiliser des commandes de plomberie si possible.

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 
Manoj Govindan
la source
Votre commande ressemble à celle que j'avais utilisée.
Paŭlo Ebermann
6
Dans mon ignorance, je serais parti avec git branch | grep -w <branch-name>. Ok, c'est une commande porcelaine, mais je ne peux pas imaginer que cet usage particulier soit changé de manière significative à l'avenir pour rendre cet extrait inutilisable ...
UncleZeiv
@UncleZeiv: Vous avez probablement raison de dire que la commande ne changerait pas de manière significative pour la rendre inutilisable. J'ai un peu un TOC à propos de choses comme la porcelaine par rapport à la plomberie, c'est tout.
Manoj Govindan
11
git rev-parse --verify <branch_name>vérifie également d'autres références telles que les balises et les hachages de validation, donc bien qu'il puisse être plus adapté à ce dont vous avez besoin, il renverra de faux positifs si vous n'êtes intéressé que précisément par les branches.
Paul S.
2
Seul le git show-ref travaille pour déterminer si une branche LOCAL est présente. Dans la mise à jour (syntaxe avec git rev-parse), le code de retour est également 0 si une branche distante correspond.
Fabien Bouleau

Réponses:

58

Pour autant que je sache, c'est la meilleure façon de le faire dans un script. Je ne suis pas sûr qu'il y ait beaucoup plus à ajouter à cela, mais il pourrait aussi bien y avoir une réponse qui dit simplement "Cette commande fait tout ce que vous voulez" :)

La seule chose à laquelle vous voudrez peut-être faire attention est que les noms de branche peuvent contenir des caractères surprenants, vous voudrez peut-être les citer <branch-name>.

Mark Longair
la source
1
bon point sur la citation <branch-name>. FWIW J'utilise ceci dans un script de fabric. Je me souviendrai de citer la variable.
Manoj Govindan
La bonne réponse est implicitement la suivante: git show-ref --verify --quiet refs / heads / <branch-name> montrera que HEAD n'est pas une branche correctement. git rev-parse --verify vous dira que HEAD est une branche existante. Faux car HEAD n'est pas une branche.
Paulo Neves
109

Lorsque je recherche «git check if branch exists» sur un moteur de recherche, cette page est la première que je vois.

J'obtiens ce que je veux, mais j'aimerais fournir une réponse mise à jour puisque le message original date de 2011.

git rev-parse --verify <branch_name>

C'est essentiellement la même chose que la réponse acceptée, mais vous n'avez pas besoin de taper "refs / heads /"

jhuynh
la source
21
Juste une note: git rev-parse --verifyvous indique seulement si un tel objet existe dans le dépôt (c'est-à-dire qu'il retournera 0 pour toute valeur de <branch_name>cela se traduit par un objet de n'importe quel type dans le dépôt). Il ne vous dit pas si cet objet est une branche ou non.
tavnab
9
Ce n'est pas une réponse correcte à la question, qui demande comment savoir si une succursale existe. Cela vous donnera un faux positif pour une balise. Vous pouvez facilement le tester vous-même. Vous avez besoin de refs / heads / pour les distinguer des balises qui se trouvent dans les refs / tags, et même des télécommandes dans les refs / remotes.
msouth
16
git rev-parse --verify gh-pages me donne: fatal: Nécessite une seule révision
SuperUberDuper
@SuperUberDuper avez-vous essayé: git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack
35

Presque là.

Laissez simplement --verifyet --quietet vous obtenez le hachage si la branche existe ou rien si ce n'est pas le cas.

Attribuez-le à une variable et recherchez une chaîne vide.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi
Martijn
la source
13
La valeur de retour est suffisante - vous n'avez pas besoin de passer par l'effort éventuellement sujet aux erreurs d'assignation à une variable.
msouth
15

Je pense que vous pouvez utiliser git show-branchici.

$ 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

Alors, $? == 0 indiquerait que la branche existe et que vous n'avez pas à creuser du tout dans la plomberie des refs / heads /. Tant que vous ne passez pas -rà show-branch, il ne fonctionnera que sur les branches locales.

Mark Drago
la source
5
AFAIK git show-branchest une commande en porcelaine . Comme je l'ai dit dans ma question, je préfère ne pas utiliser de commandes porcelaine dans un script si des équivalents de plomberie sont disponibles. Voir kernel.org/pub/software/scm/git/docs
Manoj Govindan
3
@Manoj: Je connais la porcelaine par rapport à la plomberie, mais je n'avais jamais lu que la plomberie était considérée comme plus stable que la porcelaine. Merci de m'avoir signalé cela dans la documentation.
Mark Drago
Pour éviter de trouver des balises par erreur et pour être plus précis quant à savoir si la branche est locale ou distante, vous pouvez spécifier git show-branch refs/heads/[branch]ou git show-branch refs/remotes/origin/[branch].
twasbrillig
14

Je recommande git show-ref --quiet refs/heads/$name.

  • --quiet signifie qu'il n'y a pas de sortie, ce qui est bien car vous pouvez alors vérifier proprement l'état de sortie.

  • refs/heads/$namelimites aux branches locales et correspond aux noms complets (sinon devcorrespondrait develop)

Utilisation dans un script:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi
Razzi Abuissa
la source
Ouais c'est le seul qui le fait silencieusement. La dénomination des commandes git est un peu farfelue
smac89
13

À utiliser dans un script:

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

Cela se fermera 0si et seulement si <branch-name>existe en tant que branche locale.

Exemple:

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

Sur le script batch Windows, c'est un peu différent,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)
pinkal vansia
la source
1

Appelons-le git is_localbranch(vous devez ajouter un alias .gitconfig).

Usage:

$ git is_localbranch BRANCH

La source:

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

la source
S'il s'appelle git-is_localbranch et est disponible dans n'importe quel répertoire du PATH, vous n'avez pas besoin de l'aliaser dans .gitconfig: git <command> cherchera un exécutable git- <command>, par exemple git foo cherchera un git- foo exécutable.
Dereckson le
1

Le résultat de l'examen de ma `` modification suggérée '' à la `` mise à jour '' de la question initiale était `` cela aurait dû être écrit sous forme de commentaire ou de réponse '', je le poste donc ici:

L' autre moyen proposé vérifiera non seulement les branches mais toute référence avec un tel nom @jhuynh .

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

Problème avec une `` mise à jour '' sur la question initiale expliqué:

Supposons et vérifions que «master.000» n'est qu'une balise, une telle branche locale n'existe pas, grep renvoie une entrée qui est une balise. Toujours rev-parse retournera 0 si la référence existe, même si une telle branche locale n'existe pas. Ceci est une fausse correspondance, exactement comme mentionné par @ paul-s

$ git show-ref |grep master.000

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

Ni git show-refni git rev-parsefonctionne sur mon cas.

$ 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

J'ai fini avec ça

$ 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

Vous pouvez aussi le faire avec un fichier script

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

Si vous parvenez à inclure grep.

git branch | grep -q <branch>
Daniel Vikström
la source
1
Cela pourrait vous donner une mauvaise réponse si vous utilisez des points (".") Dans les noms de branche, comme je le fais parfois, car le point est interprété par grepcomme un métacaractère.
Peter John Acklam
1
Vous obtiendrez également un faux positif si vous testez une branche dont le nom est une sous-chaîne d'une branche réelle. par exemple abc, correspondra s'il y a une branche appelée abcdef.
rjmunro le
-1

Pour une utilisation dans un script, je recommande la commande suivante:

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

Notez qu'il <repo_url>ne peut s'agir que d'un "." pour spécifier le dépôt local si vous vous trouvez dans sa structure de répertoires, le chemin vers un dépôt local ou l'adresse d'un dépôt distant.

La commande renvoie un 0 si le <branch_name>n'est pas présent de 1 s'il est présent.

David
la source
-1
git branch --list $branch_name | grep $branch_name

puis vérifiez que la valeur de retour est 0 ou 1.

Howell ZHU
la source