script para mostrar o git branch no bash não funciona mais no ubuntu 18.04

3

Na minha instalação 16.04 eu coloquei isso no meu arquivo ~/.bashrc :

#Show git branch in commandline
parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ ()/'
}
export PS1="${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u:\[3[01;34m\]\w\[3[00m\]\$(parse_git_branch)\[3[00m\] $ "

Ele mostrou um prompt assim:

user:~/myrepo (master) $

Mas quando eu faço o mesmo em 18.04, o prompt é assim:

user:~/myrepo $ 

Como faço para que funcione em 18.04?

$ printf "%q\n" "$PS1" "$PROMPT_COMMAND" "$0" "$SHELL"
\\[\033\[01\;32m\\]\u:\\[\033\[01\;34m\\]\w\\[\033\[00m\\]\$\(parse_git_branch\)\\[\033\[00m\\]\ \$\ 
''
bash
/bin/bash

Estou usando sed (GNU sed) 4.4 e GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu) . Esta é uma instalação "nova", então não há nada adicional em .bashrc .

    
por Felix Rosén 04.06.2018 / 22:14

2 respostas

2

A solução foi bastante simples.

Eu configurei um upstream, organizei um commit e o forcei. Depois disso, funcionou.

Eu achei que o script de alguma forma usou a pasta .git que é gerada com git init . Como funciona em ramificações que não têm upstream.

    
por Felix Rosén 05.06.2018 / 17:44
7

Embora você já tenha resolvido o problema, gostaria de apresentar a solução já enviada com o git:

Juntamente com o git, o arquivo /usr/lib/git-core/git-sh-prompt é instalado. Anos atrás, estava no diretório contrib , mas, enquanto isso, entrava nos caminhos oficiais. O arquivo não deve ser executado (na verdade, ele não tem x flags), mas sim originado do .bashrc . Ele define algumas funções para lidar com um prompt bonito, sendo o mais proeminente __git_ps1 .

Você pode adicionar as seguintes linhas ao seu .bashrc :

source /usr/lib/git-core/git-sh-prompt
export PS1="${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u:\[3[01;34m\]\w\[3[00m\]\$(__git_ps1)\[3[00m\] $ "

A parte superior do arquivo /usr/lib/git-core/git-sh-prompt fornece uma descrição do que mais pode ser feito. Minha versão diz 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh). , mas isso não é necessário (a instrução é obsoleta).

Você também pode definir algumas variáveis de ambiente para alterar o comportamento da função. Eu, por exemplo, uso

export GIT_PS1_SHOWDIRTYSTATE=yes

O resultado então parece:

# clean
pduck:~/oss/rsyslog (master) $ 

ou

# dirty
pduck:~/oss/rsyslog (master *) $ 

ou

# something added to index
pduck:~/oss/rsyslog (master +) $ 

ou

# in a completely fresh repo
pduck:~/oss/xxx (master #) $ 

Btw: A maneira "correta" de obter a ramificação atual é não analisar a saída de git branch , pois isso pode mudar com as novas versões do git. git branch é um comando chamado porcelain , o que significa que sua saída é legal e bonita, mas não garantida para permanecer na mesma com versões diferentes. Os caras do git recomendam, assim, as ferramentas encanamento para o script. Com o encanamento , o ramo atual pode ser determinado com

if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    current_branch=$(git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD)
else
    current_branch=""
fi

A primeira atribuição funciona se HEAD for uma referência simbólica (ou seja: uma ramificação ou tag está com check-out). Se você fez check-out de algo que não tem rótulo (por exemplo, git checkout HEAD^^ ), ele falha e usamos git rev-parse --short HEAD para mostrar o SHA1. O if verifica se estamos em um diretório de trabalho git (porque senão os comandos não fazem sentido).

    
por PerlDuck 06.06.2018 / 12:04