lista - git push
El nombre de rama complejo de Git rompiĆ³ todos los comandos de Git (1)
Problema
¿Alguien puede explicar lo que pasó? [...] Me encantaría poder eliminar esa rama, pero Git no funcionará para mí.
Mediante la ejecución
git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery
en zsh,
no creaste ninguna rama
.
En su lugar, definió accidentalmente tres
funciones de shell
, llamadas
git
,
branch
y
SSLOC-201_Implement___str__
, que ignoran sus parámetros (si los hay) y cuyo cuerpo es
_of_ProductSearchQuery
.
Puede comprobar por sí mismo que esto es lo que sucedió, invocando el comando zsh incorporado llamado
functions
, que enumera todas las funciones de shell existentes:
$ functions
SSLOC-201_Implement___str__ () {
_of_ProductSearchQuery
}
branch () {
_of_ProductSearchQuery
}
git () {
_of_ProductSearchQuery
}
Desafortunadamente, aunque las otras dos funciones de shell no son problemáticas,
la función de shell llamada "git" ahora oculta el comando
git
buena fe
.
$ which git
git () {
_of_ProductSearchQuery
}
# but the real "git" is a binary file that lives in /usr/local/bin/git (or some similar path)
Por lo tanto, posteriormente recibirá el error
command not found: _of_ProductSearchQuery
cada vez que intente ejecutar un comando Git, por ejemplo,
git log
,
git status
, etc. (suponiendo, por supuesto, que no exista un comando llamado
_of_ProductSearchQuery
).
Nota al margen
[...] Me sale el mismo error:
git:176: command not found: _of_ProductSearchQuery
(con el número después de
git
aumentando cada vez que escribo un comando)
Ese número simplemente corresponde al valor de
HISTCMD
, una variable de entorno que contiene
[l] l número de evento del historial actual en un shell interactivo, en otras palabras, el número de evento para el comando que provocó la
$HISTCMD
.
Consulte el manual de zsh para más detalles.
Solución
¿Y cómo vuelvo a la normalidad?
Simplemente elimine la función de shell problemática (y las otras dos que creó por accidente, mientras está en ello):
unset -f git
unset -f branch SSLOC-201_Implement___str__
Entonces todo debería estar bien.
¿Qué pasa si
unset
también está sombreado?
Buena pregunta ! Os remito al excelente comentario de Wumpus W. Wumbley a continuación.
Consejos para nombrar sucursales
Evita los caracteres especiales de shell
Sí, como se señala en los comentarios, los paréntesis son caracteres válidos en los nombres de rama de Git; solo necesita citar el nombre apropiadamente, ej.
$ git branch ''foo()bar''
$ git branch
foo()bar
* master
$ git checkout ''foo()bar''
Switched to branch ''foo()bar''
Sin embargo, la necesidad de citar dichos nombres cada vez que se usan como argumentos de línea de comandos debería convencerlo de que evite los paréntesis en los nombres de referencia. En términos más generales, debe (en la medida de lo posible) evitar los personajes que tienen un significado especial en las conchas, para evitar sorpresas como esta.
Use nombres de rama simples
Debes mantener los nombres de tus sucursales cortos y dulces de todos modos. Descripciones largas como
SSLOC-201_Implement ___ str __ () _ of_ProductSearchQuery
pertenecer a mensajes de confirmación, no a nombres de sucursal
Estaba tratando de crear una rama de
master
con el siguiente comando,
git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery
cuando Git de repente dejó de responder.
Sospecho que los no escapados
()
tienen la culpa, de alguna manera.
Ahora, cada vez que intento ejecutar cualquier comando de Git, aparece el mismo error:
git:176: command not found: _of_ProductSearchQuery
con el número después de
git
aumentando cada vez que escribo un comando.
¿Alguien puede explicar lo que pasó? ¿Y cómo vuelvo a la normalidad? Me gustaría eliminar esa rama, pero ¿cómo puedo hacer eso?