web-dev-qa-db-fra.com

Le nom de la branche complexe de Git a cassé toutes les commandes Git

J'essayais de créer une branche de master avec la commande suivante,

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

quand Git a soudainement cessé de répondre. Je soupçonne que les () non échappés sont en quelque sorte à blâmer. Maintenant, chaque fois que j'essaie d'exécuter une commande Git, j'obtiens la même erreur:

git:176: command not found: _of_ProductSearchQuery

avec le nombre après git augmentant chaque fois que je tape une commande.

Quelqu'un peut-il expliquer ce qui s'est passé? Et comment puis-je revenir à la normale? J'aimerais supprimer cette branche, mais comment puis-je le faire?

336
ruipacheco

Problème

Quelqu'un peut-il expliquer ce qui s'est passé? [...] J'aimerais pouvoir supprimer cette branche, mais Git ne fonctionnera pas pour moi.

En exécutant

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

dans zsh, vous n'avez créé aucune branche . Au lieu de cela, vous avez accidentellement défini trois fonctions Shell , appelées git, branch et SSLOC-201_Implement___str__, qui ignorent leurs paramètres (le cas échéant) et dont le corps est _of_ProductSearchQuery. Vous pouvez vérifier par vous-même que c'est bien ce qui s'est passé, en appelant la commande intégrée zsh appelée functions, qui répertorie toutes les fonctions Shell existantes:

$ functions                                                     
SSLOC-201_Implement___str__ () {
    _of_ProductSearchQuery
}
branch () {
    _of_ProductSearchQuery
}
git () {
    _of_ProductSearchQuery
}

Malheureusement, bien que les deux autres fonctions du shell ne posent pas de problème, , la fonction du shell appelée "git" ombrage désormais le de bonne foi git commande!

$ which git
git () {
    _of_ProductSearchQuery
}
# but the real "git" is a binary file that lives in /usr/local/bin/git (or some similar path)

Par conséquent, vous obtiendrez ultérieurement l'erreur

command not found: _of_ProductSearchQuery

chaque fois que vous essayez d'exécuter une commande Git, par ex. git log, git status, etc. (en supposant bien entendu qu'aucune commande appelée _of_ProductSearchQuery n'existe).

Note latérale

[...] J'ai la même erreur:

git:176: command not found: _of_ProductSearchQuery

(avec le nombre après git augmentant chaque fois que je tape une commande)

Ce nombre correspond simplement à la valeur de HISTCMD, une variable d’environnement contenant

Le numéro d'événement d'historique actuel dans un shell interactif, en d'autres termes, le numéro d'événement de la commande qui a provoqué la lecture de $HISTCMD.

Voir le manuel zsh pour plus de détails.

Solution

Et comment puis-je revenir à la normale?

Supprimez simplement la fonction Shell problématique (et les deux autres que vous avez créées par accident alors que vous y êtes):

unset -f git
unset -f branch SSLOC-201_Implement___str__

Alors tout devrait bien se passer.

Et si unset est également ombré?!

Bonne question ! Je vous renvoie à excellent commentaire de Wumpus W. Wumbley ci-dessous.


Conseils pour nommer les branches

Évitez les caractères spéciaux du shell

Oui, comme indiqué dans les commentaires, les parenthèses sont des caractères valides dans les noms de branche Git; il vous suffit de citer le nom de manière appropriée, par exemple.

$ git branch 'foo()bar'
$ git branch
  foo()bar
* master
$ git checkout 'foo()bar'
Switched to branch 'foo()bar'

Cependant, la nécessité de citer de tels noms à chaque fois lorsqu'ils sont utilisés comme arguments de ligne de commande devrait vous convaincre d'éviter les parenthèses dans les noms de référence. De manière plus générale, vous devriez (autant que possible) éviter les caractères qui ont une signification particulière dans les obus, afin d'éviter de telles surprises.

Utilisez des noms de branche simples

De toute façon, vous devriez garder les noms de vos branches courtes et agréables. Des descriptions longues comme

SSLOC-201_Implement ___ str __ () _ of_ProductSearchQuery

appartiennent aux messages de validation, pas aux noms de branche.

614
jub0bs