Sobre os delimitadores de linha
Toda vez que você pressiona return no seu teclado, você insere um caractere invisível denominado delimitadores de linha. Os diferentes sistemas operacionais gerenciam os delimitadores de formas diferentes.
Ao colaborar em projetos com Git e GitHub Enterprise Server, o Git pode produzir resultados inesperados se, por exemplo, você estiver trabalhando em uma máquina que use o Windows e o seu colaborador dizer uma mudança no macOS.
Você pode configurar o Git para gerenciar os delimitadores automaticamente para que você possa colaborar efetivamente com pessoas que usam diferentes sistemas operacionais.
Configurações globais para delimitadores de linhas
O comando git config core.autocrlf
é usado para alterar a forma como o Git lida com delimitadores de linha. É um argumento único.
No macOS, basta passar input
para a configuração. Por exemplo:
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS
No Windows, basta passar true
para a configuração. Por exemplo:
$ git config --global core.autocrlf true
# Configure Git to ensure line endings in files you checkout are correct for Windows.
# For compatibility, line endings are converted to Unix style when you commit files.
No Linux, basta passar input
para a configuração. Por exemplo:
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux
Configurações por repositórios
Opcionalmente, você pode configurar um arquivo .gitattributes
para gerenciar como o Git lê delimitadores de linha em um repositório específico. Quando você faz commit desse arquivo em um repositório, ele substitui a configuração core.autocrlf
para todos os colaboradores do repositório. Isso garante um comportamento consistente para todos os usuários, independentemente das configurações e do ambiente Git.
O arquivo .gitattributes
deve ser criado na raiz do repositório e deve ser feito o commit como qualquer outro arquivo.
Um arquivo .gitattributes
se parece com uma tabela com 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
Veja um arquivo .gitattributes
de exemplo. Você pode usá-lo como um modelo para os seus repositórios:
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
Você observará que os arquivos são combinados – *.c
, *.sln
, *.png
–, separados por um espaço e, em seguida, obtém uma configuração – text
, text eol=crlf
, binary
. Iremos analisar algumas possíveis configurações abaixo.
-
text=auto
O Git vai manipular os arquivos da forma que achar melhor. Essa é uma boa opção padrão. -
text eol=crlf
O Git sempre converterá delimitadores de linha emCRLF
no check-out. Você deve usar isso para arquivos que devem manter finaisCRLF
, mesmo no OSX ou Linux. -
text eol=lf
O Git sempre converterá delimitadores de linha emLF
no check-out. 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çãobinary
também é um alias para-text -diff
.
Atualizar um repositório após alterar delimitadores de linha
Depois de definir a opção core.autocrlf
ou fizer commit de um arquivo .gitattributes
, o Git altera automaticamente as terminações de linha para corresponder à nova configuração. Você pode descobrir que o Git relata alterações em arquivos que você não modificou.
Para garantir que todas as terminações de linha em seu repositório correspondam com a nova configuração, faça backup dos arquivos com o Git e remova e restaure todos os arquivos para normalizar as terminações de linha.
-
Antes de adicionar ou confirmar alterações, verifique se o Git aplicou a configuração corretamente. Por exemplo, o Git determina automaticamente se os arquivos em um repositório são arquivos binários ou de texto. Para evitar a corrupção de arquivos binários em seu repositório, recomendamos que você marque explicitamente arquivos como binários em
.gitattributes
. Para obter mais informações, confira gitattributes – Definir atributos por caminho na documentação do Git. -
Para evitar a perda de alterações locais em arquivos no repositório, adicione e confirme todas alterações pendentes executando os comandos a seguir.
Shell git add . -u git commit -m "Saving files before refreshing line endings"
git add . -u git commit -m "Saving files before refreshing line endings"
-
Para atualizar todos os arquivos no branch atual para refletir a nova configuração, execute os comandos a seguir.
Shell git rm -rf --cached . git reset --hard HEAD
git rm -rf --cached . git reset --hard HEAD
-
Para exibir os arquivos reescritos e normalizados, execute o comando a seguir.
Shell git status
git status
-
Opcionalmente, para confirmar todas alterações pendentes no repositório, execute o comando a seguir.
Shell git commit -m "Normalize all the line endings"
git commit -m "Normalize all the line endings"
Leitura adicional
- Personalizando o Git – Atributos Git no livro Pro Git
- git-config nas páginas de manual do Git
- Introdução – Configuração do Git pela primeira vez no livro Pro Git
- Mind the End of Your Line de Tim Clem