O git pode alternar automaticamente entre espaços e tabs?

Eu uso abas para indentação em meus programas python, mas gostaria de colaborar (usando git) com pessoas que usam espaços.

Existe uma maneira de o git converter automaticamente entre espaços e abas (digamos, 4 espaços = 1 aba) em empurrar / buscar? (semelhante à conversão CR / LF)

   

    Aqui está a solução completa:

    No seu repository, adicione um arquivo .git/info/attributes que contém:

     *.py filter=tabspace 

    Linux / Unix

    Agora execute os comandos:

     git config --global filter.tabspace.smudge 'unexpand --tabs=4 --first-only' git config --global filter.tabspace.clean 'expand --tabs=4 --initial' 

    OS X

    Primeiro instale coreutils com brew:

     brew install coreutils 

    Agora execute os comandos:

     git config --global filter.tabspace.smudge 'gunexpand --tabs=4 --first-only' git config --global filter.tabspace.clean 'gexpand --tabs=4 --initial' 

    Todos os sistemas

    Agora você pode verificar todos os arquivos do seu projeto. Você pode fazer isso com:

     git checkout HEAD -- ** 

    e todos os arquivos python agora terão tabulações em vez de espaços.

    Editar : alterou o comando de checkout forçado. Você deve comprometer seu trabalho primeiro, é claro.

    Sim, uma solução potencial é usar um driver de filtro de atributo git (veja também o livro GitPro ), para definir um mecanismo de borrar / limpar.

    texto alternativo

    Dessa maneira:

    • cada vez que você faz o checkout de alguns arquivos do seu repository, os espaços podem ser convertidos em abas,
    • mas quando você faz check-in (e empurra e publica), esses mesmos arquivos são armazenados de volta usando apenas espaços.

    Você pode declarar este driver de filtro (denominado aqui ‘ tabspace ‘) no .git/info/attributes (para um filtro aplicado a todos os arquivos dentro do repository do Git), com o seguinte conteúdo:

     *.py filter=tabspace 

    Agora execute os comandos:

     # local config for the current repo git config filter.tabspace.smudge 'script_to_make_tabs' git config filter.tabspace.clean 'script_to_make_spaces' 

    Veja a resposta de Olivier para um exemplo de trabalho concreto de um conjunto de instruções desse tipo.

    Informações muito úteis para todos que usam o GitHub (ou outro serviço semelhante)

    ~/.gitconfig

     [filter "tabspace"] smudge = unexpand --tabs=4 --first-only clean = expand --tabs=4 --initial [filter "tabspace2"] smudge = unexpand --tabs=2 --first-only clean = expand --tabs=2 --initial 

    Então eu tenho dois arquivos: attributes

     *.js filter=tabspace *.html filter=tabspace *.css filter=tabspace *.json filter=tabspace 

    e attributes2

     *.js filter=tabspace2 *.html filter=tabspace2 *.css filter=tabspace2 *.json filter=tabspace2 

    Trabalhando em projetos pessoais

     mkdir project cd project git init cp ~/path/to/attributes .git/info/ 

    Dessa forma, quando você finalmente empurra seu trabalho no github, ele não parecerá tolo na visualização de código com 8 space tabs que é o comportamento padrão em todos os navegadores.

    Contribuindo para outros projetos

     mkdir project cd project git init cp ~/path/to/attributes2 .git/info/attributes git remote add origin git@github.com:some/repo.git git pull origin branch 

    Dessa forma, você pode trabalhar com guias normais em 2 space indented projetos 2 space indented .

    Claro que você pode escrever uma solução semelhante para converter de 4 space to 2 space que é o caso se você quiser contribuir com projetos publicados por mim e você tende a usar 2 espaços durante o desenvolvimento.

    Se você está no Windows, então você tem alguns passos extras para que a solução do @Olivier Verdier funcione.

    1. Baixar CoreUtils for windows
    2. Depois de instalar coloque o local de instalação no seu PATH ( Como adicionar uma variável de caminho )
    3. Renomeie o expand.exe para o gexpand.exe já que já existe um utilitário de expansão do windows.