mostra ramificação git em 'ls -l'

4

É possível configurar o comando ls para que, quando eu usar ls -l , ele anexe o nome da ramificação git após o nome do diretório, se o diretório for um repositório git?

Desta forma, posso encontrar rapidamente os repositórios git no diretório atual, assim como o status de trabalho deles.

Algo parecido com isto:

-rw-rw-r--  1 michael michael    8 Aug 26 02:07 a-file
drwxrwxr-x  3 michael michael 4096 Aug 26 02:07 a-repo/ (master)
drwxrwxr-x  2 michael michael 4096 Aug 26 02:07 not-a-repo/

Nota: Eu não estou olhando para mostrar ramificação git para o diretório atual ou como parte do prompt do shell, que eu já sei como .

    
por Michael Kim 26.08.2017 / 11:12

2 respostas

1

OK ... Vendo que não há uma maneira integrada de fazê-lo, fui em frente e escrevi meu próprio programa em Python. Você pode obtê-lo com pip:

pip3 install mklsgit

Atualmente suportam apenas o Python3.

link do GitHub

    
por Michael Kim 28.08.2017 / 01:18
4

Eu escrevi uma pequena função Bash usando principalmente awk para processar a saída de ls e anexar nomes de ramificação de diretórios a diretórios, se eles fazem parte de repositórios.

Instalação:

Para instalar a função, simplesmente copie a linha abaixo e anexe-a ao final do seu arquivo ~/.bashrc . Você precisa source .bashrc depois disso ou reiniciar a sessão do shell para que a alteração entre em vigor.

lg (){ ls -alF "$@"|awk '{match($0,/^(\S+\s+){8}(.+)$/,f);b="";c="git -C \""f[2]"\" branch 2>/dev/null";while((c|getline g)>0){if(match(g,/^\* (.+)$/,a)){b="("a[1]")"}};close(c);print$0,b}';}

Depois disso, você terá um novo comando lg disponível que se comporta como o padrão ll alias (na verdade ls -alF ), mas com a ramificação git atual anexada.

Exemplo de uso:

Aqui estão alguns exemplos de saída, não os nomes das ramificações entre colchetes atrás de git1/ e git2/ :

$ lg
total 48 
drwxrwxr-x 12 bytecommander bytecommander 4096 Aug 26 14:48 ./ 
drwxr-xr-x 74 bytecommander bytecommander 4096 Aug 26 15:30 ../ 
drwxrwxr-x  6 bytecommander bytecommander 4096 Aug 26 14:43 git1/ (master)
drwxrwxr-x  7 bytecommander bytecommander 4096 Aug 26 14:42 git2/ (develop)
drwxrwxr-x  4 bytecommander bytecommander 4096 Aug 26 14:45 no-git/ 
-rw-rw-r--  1 bytecommander bytecommander    0 Aug 26 14:42 regular-file 

O comando lg ainda aceita todos os tipos de argumentos, assim como ls . Você pode, por exemplo execute lg -h , lg ~/projects , lg .. etc.

Atualizações:

  • Corrigido problema com nomes de arquivos contendo espaços ou começando com # .

Erros e desvantagens conhecidos:

  • A saída não será colorida ao contrário da saída padrão ls (por exemplo, diretórios são azuis, executáveis verdes, links simbólicos cyan, ...).
  • Ele não pode manipular nomes de arquivos com caracteres de nova linha. Eles serão exibidos, mas nenhuma informação de filial é mostrada.
  • A saída ls sempre estará correta e exibirá informações sobre o caminho especificado como argumento (se houver, caso contrário, o diretório atual será o padrão). No entanto, as informações de ramificação para as entradas ./ e ../ são sempre relativas ao diretório de trabalho atual, não ao diretório especificado.
  • Se você executar isso dentro de um repositório, cada subdiretório também receberá a ramificação anexada. A função não faz distinção entre os diretórios raiz do repositório e quaisquer subdiretórios do repositório.

Se você encontrar mais problemas ou conhecer uma solução para um dos problemas listados, fique à vontade para deixar um comentário.

    
por Byte Commander 26.08.2017 / 17:33