O nome complexo da ramificação Git quebrou todos os comandos Git

338

Eu estava tentando criar uma ramificação mastercom o seguinte comando,

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

quando Git de repente parou de responder. Suspeito que os não-escapados ()sejam os culpados, de alguma forma. Agora, sempre que tento executar qualquer comando Git, recebo o mesmo erro:

git:176: command not found: _of_ProductSearchQuery

com o número depois de gitaumentar toda vez que digito um comando.

Alguém pode explicar o que aconteceu? E como eu volto ao normal? Gostaria de excluir esse ramo, mas como posso fazer isso?

ruipacheco
fonte
8
Eu acho que isso está relacionado ao seu ambiente zsh, pois fui capaz de executar a criação do ramo no meu shell bash sem efeitos colaterais (lubuntu 13.10), mas estou vendo o erro quando mudo para o meu zsh totalmente baunilha
Jonathan.Brink
27
No futuro, cite coisas que parecem suspeitas. git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"funciona muito bem.
Qix - MONICA FOI ERRADA EM 02/09
11
@Qix Melhor evitar caracteres problemáticos por completo.
jub0bs 2/09/2015
3
@Jubobs Definitivamente, embora eu já tenha visto certas empresas impor nomes de agências estranhos como esse.
Qix - MONICA FOI ERRADA EM 02/09
11
@DwightSpencer Seu link é específico para Bash, mas esta pergunta é específica para zsh. O problema não ocorre realmente no Bash.
Jb0bs 9/09/15

Respostas:

617

Problema

Alguém pode explicar o que aconteceu? [...] eu adoraria poder excluir esse ramo, mas o Git não funcionará para mim.

Correndo

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

no zsh, você não criou nenhum ramo . Em vez disso, você acidentalmente definiu três funções shell , chamados git, branche SSLOC-201_Implement___str__que ignoram os seus parâmetros (se houver) e cujo corpo é _of_ProductSearchQuery. Você pode verificar por si mesmo que isso foi realmente o que aconteceu, invocando o comando zsh functionsincorporado chamado , que lista todas as funções de shell existentes:

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

Infelizmente, embora as outras duas funções do shell não sejam problemáticas, a função do shell chamada "git" agora obscurece o comando de boa-fé git !

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

Portanto, você receberá o erro posteriormente

command not found: _of_ProductSearchQuery

sempre que você tentar executar um comando Git, por exemplo git log, git statusetc. (assumindo, é claro, que nenhum comando chamado _of_ProductSearchQueryexista).

Nota

[...] eu recebo o mesmo erro:

git:176: command not found: _of_ProductSearchQuery

(com o número após gitaumentar sempre que digito um comando)

Esse número corresponde simplesmente ao valor de HISTCMD, uma variável de ambiente que contém

[o] número do evento do histórico atual em um shell interativo, ou seja, o número do evento para o comando que causou $HISTCMDa leitura.

Veja o manual do zsh para mais detalhes.

Solução

E como eu volto ao normal?

Simplesmente exclua a função de shell problemática (e as outras duas que você criou acidentalmente, enquanto faz isso):

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

Então tudo deve ficar bem.

E se unsettambém estiver sombreado ?!

Boa pergunta ! Refiro-lhe o excelente comentário de Wumpus W. Wumbley abaixo.


Dicas para nomear filiais

Evite caracteres especiais do shell

Sim, conforme indicado nos comentários, parênteses são caracteres válidos nos nomes de ramificações do Git; você só precisa citar o nome adequadamente, por exemplo

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

No entanto, a necessidade de citar esses nomes sempre que usados ​​como argumentos de linha de comando deve convencê-lo a evitar parênteses nos nomes de referência. De maneira mais geral, você deve (o máximo possível) evitar personagens que tenham um significado especial nas conchas, para evitar surpresas como essa.

Use nomes simples de ramificações

Você deve manter os nomes de suas filiais curtos e agradáveis ​​de qualquer maneira. Descrições longas como

SSLOC-201_Implement ___ str __ () _ of_ProductSearchQuery

pertencem a mensagens de confirmação, não a nomes de ramificações.

jub0bs
fonte
4
Nada nesse estado de thread é ilegal. Git parecia gostar muito bem. Switched to a new branch 'abcd-()-foo'
Qix - MONICA FOI ERRADA
11
Parece bom; definitivamente não é uma boa ideia usá-los, mas eles não são tecnicamente inválidos.
Qix - MONICA FOI ERRADA
12
O que acontece se alguém também sombreia unsetcriando a função shell chamada? (isto é possível?)
Matteo Umili
2
@codroipo Ha! Este é um bom ponto. Sim, é possível e, nesse caso, é melhor você reiniciar zsh.
Jub0bs # 3/15
45
Você poderia usar builtin unset. Se builtine unsetforam sombreados por funções, então unfunction. Se isso também se foi unhash -f. Se todos os quatro se foram, em seguida, reiniciar o shell.