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

j'essayais de créer une branche à partir 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 () sont à blâmer, d'une façon ou d'une autre. 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 obtenir de retour à la normale? J'aimerais supprimer cette branche, mais comment faire?

331
demandé sur jubobs 2015-09-02 17:12:48
la source

1 ответов

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 pas créé de toute branche . Au lieu de cela, vous avez accidentellement défini trois fonctions shell , appelé 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 invoquant la commande intégrée zsh appelée functions , qui liste 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 de shell ne soient pas problématiques, la fonction de shell appelée "git" fait maintenant ombre à la bona fide 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 par la suite l'erreur

command not found: _of_ProductSearchQuery

chaque fois que vous tentez d'exécuter une commande Git, par exemple git log , git status , etc. (en supposant, bien sûr, qu'aucune commande appelée _of_ProductSearchQuery existe).

note

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

git:176: command not found: _of_ProductSearchQuery

(le nombre après git augmentant à chaque fois I type A Commande)

ce nombre correspond simplement à la valeur de HISTCMD , une variable d'environnement qui détient

[t]il dans l'histoire actuelle numéro d'événement dans un shell interactif, en d'autres termes, le numéro d'événement pour la commande qui a causé $HISTCMD pour être lu.

voir le manuel zsh pour plus de détails.

Solution

et comment revenir à la normale?

supprimez simplement la fonction de shell problématique (et les deux autres que vous avez créé par accident, pendant que vous y êtes):

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

alors tout devrait aller bien.

et si unset est aussi ombragé?!

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


Branche de nommage des conseils

éviter tout caractère spécial de l'interpréteur de commandes

Oui, comme indiqué dans les commentaires, les parenthèses sont des caractères valides dans les noms de branche Git; vous avez juste besoin 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 lorsque utilisé comme argument de ligne de commande devrait vous convaincre d'éviter les parenthèses dans les noms de référence. Plus généralement, vous devriez (autant que possible) éviter les caractères qui ont une signification particulière dans les coquilles, pour éviter les surprises comme celle-ci.

utiliser des noms de branche simples

vous devriez garder vos noms de branche courts et doux de toute façon. De longues descriptions comme

SSLOC-201_implementation _ _ _ str _ _ () _ of_productsearchquery

appartiennent dans les messages de propagation, pas dans les noms de branche.

610
répondu jubobs 2017-05-23 14:45:29
la source

Autres questions sur git git-branch zsh parentheses