Configurar o Git para uso com delimitadores de linha
Para evitar problemas com diffs, é possível configurar o Git para operar adequadamente com delimitadores de linhas.
Neste artigo
- Configurações globais para delimitadores de linhas
- Configurações por repositórios
- Atualizar um repositório após alterar delimitadores de linha
- Leia mais
Todas as vezes que você pressiona return no seu teclado, na verdade você está inserindo um caractere invisível denominado delimitador de linha. Historicamente, sistemas operacionais diferentes trataram os delimitadores de linhas de forma distintas.
Quando você visualiza as alterações em um arquivo, o Git opera os delimitadores de linhas à sua própria maneira. Como você está colaborando com projetos no Git e no GitHub Enterprise, o Git poderá produzir resultados inesperados se, por exemplo, você estiver trabalhando em uma máquina com Windows e seu colaborador fez uma alteração no OS X.
Configurações globais para delimitadores de linhas
O comando git config core.autocrlf
é utilizado para alterar a forma como o Git trabalha com delimitadores de linhas. É um argumento único.
No OS X, você simplesmente introduz input
(entrada) na configuração. Como por exemplo:
$ git config --global core.autocrlf input
# Configura o Git no OS X para operar adequadamente com delimitadores de linhas
No Windows, você simplesmente introduz true
na configuração. Como por exemplo:
$ git config --global core.autocrlf input true
# Configura o Git no Windows para lidar corretamente com delimitadores
No Linux, você simplesmente introduz input
(entrada) na configuração. Por exemplo:
$ git config --global core.autocrlf input
# Configura o Git no Linux para operar adequadamente com delimitadores de linhas
Configurações por repositórios
Como opção, é possível configurar a forma como o Git gerencia os delimitadores de linhas por repositório configurando um arquivo especial .gitattributes. É feito commit desse arquivo no repositório, o que anula a configuração core.autocrlf
de um indivíduo, garantindo um comportamento consistente para todos os usuários, independentemente das configurações deles no Git. A vantagem de um arquivo .gitattributes é que as as configurações de linhas são associadas ao repositório. Você não precisa se preocupar se os colaboradores têm as mesmas configurações de linhas que você.
O arquivo .gitattributes deve ser criado na raiz do repositório e, como qualquer outro arquivo, com commit.
Um arquivo .gitattributes se parece com uma tabela de duas colunas:
- À esquerda está o nome do arquivo para o Git fazer a correspondência.
- À direita está a configuração do delimitador de linha que o Git deve usar para esses arquivos.
Exemplo
Segue aqui um exemplo de arquivo .gitattributes. Você pode usá-lo como modelo para seus repositórios:
# Defina o comportamento padrão, caso as pessoas não tenham configurado o core.autocrlf.
* text=auto
# Declare explicitamente os arquivos de texto que você deseja que sempre sejam normalizados e convertidos
# em delimitadores de linha nativos ao fazer checkout.
*.c text
*.h text
# Declare os arquivos que sempre terão delimitadores de linha CRLF ao fazer checkout.
*.sln text eol=crlf
# Indique todos os arquivos que são verdadeiramente binários e que não devem ser modificados.
*.png binary
*.jpg binary
Você observará que os arquivos são correspondentes--*.c
, *.sln
, *.png
--, separados por um espaço e recebem uma configuração--text
, text eol=crlf
, binary
. Vamos ver algumas configurações possíveis abaixo.
- "text=auto"
- O Git vai operar os arquivos da forma que achar melhor. Essa é uma boa opção padrão.
- "text eol=crlf"
- O Git sempre converterá os delimitadores em "CRLF" ao fazer checkout. É recomendável usar isso para arquivos que precisam manter os delimitadores "CRLF", mesmo no OSX ou no Linux.
- "text eol=lf"
- O Git sempre converterá os delimitadores em "LF" ao fazer checkout. Você deve usar isso para arquivos que devem manter os delimitadores LF, mesmo no Windows.
- "binary"
- O Git entenderá que os arquivos especificados não são texto e não deverá tentar alterá-los. A configuração "binary" também é um alias para "-text -diff".
-
Salva seus arquivos atuais no Git, assim seu trabalho não será perdido.
$ git add . -u $ git commit -m "Saving files before refreshing line endings"
-
Adiciona todos os seus arquivos alterados novamente e normaliza os delimitadores de linha.
$ git add --renormalize .
-
Mostra os arquivos regravados e normalizados.
$ git status
-
Faz commit das alterações em seu repositório.
$ git commit -m "Normalize all the line endings"
- "Personalizar o Git - atributos Git" no livro Pro Git
- "git-config(1) Página do Manual"
- "Introdução - Configurar o Git pela primeira vez" no livro Pro Git
- "Cuide do fim de sua linha" - A história completa dos delimitadores de linha no Git, por Tim Clem
Atualizar um repositório após alterar delimitadores de linha
Depois de configurar a opção core.autocrlf
e fazer commit de um arquivo .gitattributes, você vai notar que o Git deseja fazer commit de arquivos que você não modificou. Neste ponto, o Git está ansioso para alterar os delimitadores de linhas em todos os arquivos para você.
A melhor maneira de configurar automaticamente os delimitadores no repositório é primeiro fazer backup dos arquivos com o Git, excluir todos os arquivos no repositório (exceto o diretório .git) e depois restaurar todos os arquivos de uma vez.