343 votes

Nom de la branche des Git complexe a brisé toutes les commandes Git

J'essaie de créer une branche à partir de l' master avec la commande suivante

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

lorsque Git soudainement cessé de répondre. Je soupçonne que le non échappés () doit avoir fait quelque chose pour elle. Maintenant, chaque fois que j'essaie d'exécuter toute commande Git, j'obtiens le même message d'erreur:

git:176: command not found: _of_ProductSearchQuery

(avec le nombre suivant le nombre 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 être en mesure de supprimer cette branche, mais Git de ne pas travailler pour moi.

620voto

Jubobs Points 1246

Problème

Quelqu'un peut-il expliquer ce qui s'est passé? [...] J'aimerais être en mesure de supprimer cette branche, mais Git de ne pas travailler pour moi.

En exécutant

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

en zsh, vous avez créé aucune branche. Au lieu de cela, vous avez accidentellement défini trois shell fonctions, appelées git, branch, et SSLOC-201_Implement___str__, qui ne tiennent pas compte de leurs paramètres (le cas échéant) et dont le corps est - _of_ProductSearchQuery.

Malheureusement, bien que les deux autres fonctions d'interpréteur de commandes ne posent pas problème, la fonction shell appelé git maintenant les ombres de la bonne foi Git git commande! Comme un résultat, vous sera par la suite obtenir l'erreur

command not found: _of_ProductSearchQuery

chaque fois que vous essayez 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).

Vous pouvez le vérifier vous-même que c'est en effet ce qui se passe, par la définition des fonctions d'interpréteur de commandes qui ne renvoie pas d'erreur, par ex.

$ git branch f() echo "foo"
$ git
foo
$ branch
foo
$ f
foo
$ git status
foo

[...] J'ai le même message d'erreur:

git:176: command not found: _of_ProductSearchQuery

(avec le nombre suivant le nombre git augmentant à chaque fois que je tape une commande)

Ce nombre correspond tout simplement à la valeur de HISTCMD, une variable d'environnement qui contient

[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 d'être lu.

Voir l' zsh manuel pour plus de détails.

Solution

Et comment puis-je revenir à la normale?

Il suffit de supprimer la problématique de la fonction shell (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__

Ensuite, tout devrait bien se passer.


Direction générale de nommage des conseils

Éviter toute spéciale shell caractères

Oui, comme l'a souligné dans les commentaires, les parenthèses sont des caractères valides dans Git branch noms; vous avez juste besoin de citer le nom de façon appropriée, par ex.

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

Cependant, vous devez (autant que possible) d'éviter les caractères qui ont une signification particulière dans les coquilles, pour éviter les mauvaises surprises comme celle-ci.

Utiliser de simples noms de branche

Vous devez garder vos noms de branche court et doux de toute façon. Les longues descriptions comme

SSLOC-201_mettre en Œuvre___str__()_of_ProductSearchQuery

appartiennent à des messages de commit, pas dans les noms de branche.

33voto

larsks Points 23184

Vous pouvez supprimer manuellement la branche Git en supprimant le fichier correspondant dans l' .git/refs/heads répertoire. Cela devrait résoudre votre problème.

Je soupçonne que le problème est en fait pas avec Git, mais c'est avec votre shell: si vous avez (comme moi) ont une invite dynamique qui vous montre l'actuelle branche Git, il est probable que la coquille est d'étouffement sur les parenthèses, tout en essayant de générer de l'invite de commandes.

Si la branche avec le nom bizarre a été votre branche, vous pouvez également besoin de fixer .git/HEAD de point de branche à l'autre, comme ceci:

echo ref: refs/heads/master > .git/HEAD

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