O prompt não atualiza o ramo git

4

Eu tentei integrar o branch git atual no meu prompt, mas ele não se comporta como esperado. Eu estou usando o bash no Ubuntu 16.04 e git 2.7.4. Quando eu inicio um terminal, nada do git é mostrado. Se eu obter meu .bashrc de dentro de um repositório, o ramo é mostrado, mas não atualiza mais. Isto é o que eu escrevi no meu .bashrc:

green="\[3[01;32m\]"
blue="\[3[01;34m\]"
no_color="\[3[00m\]"
purple="\[3[01;35m\]"

source ~/.git-prompt.sh
export PS1="$purple\u $green$(__git_ps1 " (%s)") $blue\W $no_color \$ "

Atualização:

Eu tentei seguir as instruções em git-prompt , mas ainda assim o mesmo resultado. No entanto, se eu apenas copiar a sugestão de git-prompt: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' funciona, mas é claro que não parece que eu quero. Existe algum erro de sintaxe que está faltando? O modelo PS1 funciona mesmo se não usar export, apenas PS1=...

    
por Pepe 24.03.2017 / 16:10

2 respostas

3

Ok, encontrei a solução. Não é necessário usar o comando prompt. O bug surge devido a um erro de sintaxe.

Se eu atribuir o conteúdo de PS1 com "" para usar minhas variáveis para as cores, ele só executará a função __git_ps1 quando .bashrc for originado.

Mas quando atribuo o conteúdo PS1 em '' e o faço sem variáveis para a cor e, em vez disso, escrevo os códigos, ele funciona como esperado. E enquanto eu leio aqui parece melhor prática para não exportar o PS1 para o meio ambiente.

Então a solução parece:

PS1='\[3[01;35m\]\u \[3[01;32m\]$(__git_ps1 " (%s)") \[3[01;34m\]\W \[3[00m\] \$ '

No entanto, eu estaria curioso para saber, qual é a razão para isso. Ele funciona dentro de "" no macOS.

    
por Pepe 25.03.2017 / 10:23
3

Isso porque .bashrc é lido apenas uma vez: quando você inicia um novo shell interativo de não-login (quando você abre um novo terminal, por exemplo). Portanto, o PS1 é definido na primeira vez que você abre o terminal e nunca é alterado.

A maneira correta de fazer isso (supondo que seus scripts git-prompt e __git_ps funcionem como esperado) é usar PROMPT_COMMAND . Conforme explicado em man bash :

   PROMPT_COMMAND
          If set, the value is executed as a command prior to issuing each
          primary prompt.

Você deseja que __git_ps1 seja executado antes que cada prompt seja exibido (assim, após cada comando executado, após um cd , por exemplo). Portanto, você precisa colocá-lo em PROMPT_COMMAND . Se o seu __git_ps1 é o que eu acho que é, vai definir PS1 para você. Você só precisa executá-lo toda vez que um prompt for exibido. Então, adicione esta linha ao seu ~/.bashrc :

PROMPT_COMMAND="$purple\u $green$(__git_ps1 "(%s)") $blue\W $no_color \$ "

Por fim, não posso ter certeza, pois você não está mostrando os scripts relevantes, mas duvido muito que o (%s) faça sentido lá. Isso apenas imprimirá a string %s . Se você precisar de mais ajuda, edite sua pergunta e eu) inclua __git_ps1 e /etc/bash_completion.d/git-prompt (ou conte-nos como você os instalou se eles vieram de um pacote Ubuntu) e ii) mostre-nos o que seu prompt deve procurar gostar.

    
por terdon 24.03.2017 / 16:27

Tags