233 votes

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

J'utilise la commande suivante pour savoir si une local branche git avec branch-name existe dans mon dépôt. Est-ce correct ? Existe-t-il un meilleur moyen ?

Veuillez noter que je fais cela à l'intérieur d'un script. Pour cette raison, j'aimerais utiliser les commandes de plomberie si possible.

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists.

0 votes

Votre commande ressemble à celle que j'avais utilisée.

7 votes

Dans mon ignorance, je serais parti avec git branch | grep -w <branch-name> . Ok, c'est une commande de porcelaine, mais je ne peux pas imaginer que cette utilisation particulière soit modifiée de manière significative dans le futur au point de rendre ce snippet inutilisable...

0 votes

@UncleZeiv : Vous avez probablement raison de dire que la commande ne changerait pas de manière significative pour la rendre inutilisable. Je suis un peu obsédé par ce genre de choses, comme la porcelaine par rapport à la plomberie, c'est tout.

73voto

Mark Longair Points 93104

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 de choses à 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 devez faire attention est que les noms des branches peuvent contenir des caractères surprenants, vous pouvez donc citer <branch-name> .

1 votes

Bon point pour la citation <branch-name> . Pour info, je l'utilise dans un script de tissu. Je n'oublierai pas de citer la variable.

1 votes

La réponse correcte est la suivante implicitement : 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.

41voto

Martijn Points 1218

On y est presque.

Laissez juste de côté le --verify y --quiet et vous obtenez soit le hash si la branche existe, soit rien si elle n'existe pas.

Attribuez-le à une variable et vérifiez si la chaîne est vide.

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

18 votes

La valeur de retour est suffisante - vous n'avez pas besoin de passer par l'effort d'affectation à une variable, qui peut être source d'erreurs.

0 votes

Dévalorisé parce que vous pouvez simplement vérifier la valeur de retour.

15voto

Mark Drago Points 801

Je pense que vous pouvez utiliser git show-branch ici.

$ 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

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

5 votes

AFAIK git show-branch est un porcelaine commandement. Comme je l'ai dit dans ma question, je préfère ne pas utiliser les commandes de porcelaine dans un script si des équivalents en plomberie sont disponibles. Voir kernel.org/pub/software/scm/git/docs

3 votes

@Manoj : Je connais l'existence de 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 indiqué ce point dans la documentation.

0 votes

Pour éviter de trouver des balises par erreur, et pour être plus précis sur le fait que la branche est locale ou distante, vous pouvez spécifier git show-branch refs/heads/[branch] ou git show-branch refs/remotes/origin/[branch] .

2voto

ZDroid Points 263

Appelons-le git is_localbranch (vous devez ajouter l'alias dans .gitconfig ).

Utilisation :

$ git is_localbranch BRANCH

Source :

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

0 votes

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

-2voto

Dala Points 1

Si vous arrivez à inclure grep.

git branch | grep -q <branch>

1 votes

Cela pourrait vous donner une mauvaise réponse si vous utilisez des points (".") dans les noms de branches, comme je le fais parfois, car le point est interprété par la fonction grep comme métacaractère.

1 votes

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 ex. abc correspondra s'il existe une branche appelée abcdef .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X