A dica Git da semana é sobre autocompletar em ambientes shell.
Embora muitos clientes GUI existam para Git, às vezes é útil utilizar o shell a fim de trabalhar com repositórios. Todos os exemplos usados em meus artigos mostram os equivalentes de shell, já que isso tem mais a ver com conceitos do que com implementações específicas.
Este artigo é diferente, no sentido de que é explicitamente sobre como trabalhar com Git no shell. Se você nunca usa shells para o desenvolvimento de repositórios Git – ou você está usando Windows – então você pode voltar seguramente na próxima semana para algo mais geral.
A maioria dos shells é inteiramente caracterizada por ambientes de programação, cujos talentos é frequentemente subutilizado como um meio de fiscalizar o sistema de arquivos. Você pode criar funções, loops, processamento de arquivos, e assim por diante. E a maioria dos shells possui um meio de exibir um prompt, que nos exemplos que estou usando foi apenas $. Mas isso pode ser alterado para qualquer outro valor que ofereça um valor diferente para uma variável denominada PS1:
$ export PS1='+++ Redo From Start +++ '
+++ Redo From Start +++ echo Hello World
Hello World
+++ Redo From Start +++
Isso não é particularmente emocionante, apenas mudou de $ para +++ Redo From Start +++. Observe que foi especificado nas citações para assegurar que o trailing space esteja presente em PS1, já que, caso contrário, ele mancharia o comando dado.
Acontece que PS1 é avaliado toda vez, o que significa que podemos usar uma função em vez de texto estático a cada vez que quisermos usá-lo:
$ d() { date; }
$ d
Thu 14 Jul 2011 08:34:31 BST
$ PS1='$(d) \$ '
Thu 14 Jul 2011 08:34:50 BST $ echo Hello
Hello
Thu 14 Jul 2011 08:34:51 BST $ echo World
World
Thu 14 Jul 2011 08:34:52 BST $
Observe que cada vez que pressionarmos enter depois de um comando, a função é chamada novamente, e você terá um tempo diferente. (Se você vê o mesmo timestamp, verifique se você se lembrou das aspas em torno da variável, caso contrário, a função será datada no tempo de execução PS1; verifique se é o que você espera imprimindo a variável com echo $PS1).
Como isso se encaixa com Git? Bem, acontece que há um ótimo script chamado git-completion.bash no diretório contrib da sua instalação Git; se ele não estiver lá, você pode fazer uma cópia da contrib/completion/git-completion.bash.
Você pode fazer uma cópia do script em seu diretório local (ou apenas fazer um symlink para a localização do contrib) – nos exemplos abaixo, eu o copiei como .git-completion.sh em meu diretório home… Você precisa definir essa fonte toda vez que iniciar o shell, o caminho comum (para bash shells) é adicionar isso ao seu script .bashrc:
$ echo source ~/.git-completion.sh >> .bashrc
O .bashrc é lido a cada um (non-login) bash shell, embora haja um .bash_profile que é utilizado para shells de login. Para garantir uma experiência consistente, assegure que o seu .bash_profile guarde o conteúdo do seu .bashrc e, em seguida, coloque as mudanças apenas no arquivo .bashrc:
$ echo source ~/.bashrc >> .bash_profile
Observe que no Mac OS X, novo Terminal Windows e abas são sempre considerados shells de login, por isso esse é um passo necessário para usuários do OS X.
Exibindo o status do Git no prompt
Tendo percorrido o básico, como podemos usar isso para a nossa vantagem em repositórios Git? Bem, o script git-completion.sh define uma função, __git_ps1, que lhe dá informações sobre em qual branch você está, se você estiver em um repositório Git. (Note que você deve iniciar um novo shell para assegurar que funcione o script de autocompletar):
$ __git_ps1
(master)
$ cd /tmp
$ __git_ps1
$
Isso nos dá o branch em que estamos se estivermos em um repositório Git, e nada se não estivermos em um repositório. Podemos usar isso para configurar um prompt apropriadamente:
$ export PS1='$(__git_ps1) \$ '
(master) $ cd /tmp
$
Isso nos mostra quando estamos no branch master, e não quando não estamos, mas nos dá espaços extras. Podemos formatar isso passando um %s (formatação printf padrão para uma string) para adicionar um espaço somente quando necessário:
$ export PS1='$(__git_ps1 "%s ")\$ '
master $ git checkout -b example
example $
Bem como mostrar o branch, você também pode mostrar se existem alterações não comitadas ou se você está atrás/à frente de um branch remote. Existem diferentes variáveis que você pode definir:
- GIT_PS1_SHOWDIRTYSTATE=true irá mostrar um * se houver mudanças não organizadas, e + se elas forem organizadas (mas não comitadas)
- GIT_PS1_SHOWSTASHSTATE=true irá mostrar um $ caso haja arquivos ocultos
- GIT_PS1_SHOWTRACKEDFILES=true mostrará um % se houver arquivos trackeados
- GIT_PS1_SHOWUPSTREAM=auto mostrará um = se você estiver no mesmo commit, < se você estiver atrás, > se estiver à frente e <> se você tiver divergido do upstream branch.
Autocompletar
Até agora, já conversamos sobre a variável de ambiente PS1 e o trackeamento do nome do branch (juntamente com shells). No entanto, o script de autocompletar também adiciona na habilidade de autocompletar comandos git (incluindo argumentos). Simplesmente digitando alguns caracteres, você pode completar nomes de argumentos e nomes de branch/tag apertando a tecla TAB. Isso pode ser útil caso você não conheça as opções completas que um comando pode ter (digite — e, em seguida, aperte TAB) ou quando você está se referindo a um branch/tag com frequência e não quer digitá-lo toda hora.
Há muito mais que você pode fazer para personalizar seu prompt shell, uma vez que o Git é executado rapidamente, e você pode configurar uma função para fazer o que quiser, é possível imprimir o id do commit atual ou até mesmo usar cores para indicar diferentes estágios. Extensões similares existem para diferentes shells, como o extravagante prompt ZSH de Steve Losh.
?
Texto original disponível em http://alblue.bandlem.com/2011/07/git-tip-of-week-autocompletion-in.html







