# Configurando o Git para lidar com finais de linha

Para evitar problemas com diffs, é possível configurar o Git para operar adequadamente com delimitadores de linhas.

## Sobre os finais de linha

Toda vez que você pressiona <kbd>return</kbd> no seu teclado, você insere um caractere invisível denominado delimitadores de linha. Os diferentes sistemas operacionais gerenciam as quebras de linha de maneira diferente.

Quando você estiver colaborando em projetos com o Git e GitHub, o Git poderá produzir resultados inesperados se, por exemplo, você estiver trabalhando em um computador Windows e seu colaborador tiver feito uma alteração no macOS.

Você pode configurar o Git para gerenciar as quebras de linha 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 quebras de linha. É um argumento único.

<div class="ghd-tool mac">

No macOS, basta passar `input` para a configuração. Por exemplo:

```shell
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS
```

</div>

<div class="ghd-tool windows">

No Windows, basta passar `true` para a configuração. Por exemplo:

```shell
$ 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.
```

</div>

<div class="ghd-tool linux">

No Linux, basta passar `input` para a configuração. Por exemplo:

```shell
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux
```

</div>

## Configurações por repositório

Opcionalmente, você pode configurar um arquivo `.gitattributes` para gerenciar como o Git lê finais 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 comitado 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 de final 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:

```text
# 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 em `CRLF` no check-out. Você deve usar isso para arquivos que devem manter finais `CRLF`, mesmo no OSX ou Linux.

*               `text eol=lf` O Git sempre converterá delimitadores de linha em `LF` 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ção `binary` 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.

1. 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](https://www.git-scm.com/docs/gitattributes#_marking_files_as_binary) na documentação do Git.
1. 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 copy
   git add . -u
   git commit -m "Saving files before refreshing line endings"
   ```

1. Para atualizar todos os arquivos no branch atual de modo a refletir a nova configuração, execute o comando a seguir.

   ```shell copy
   git add --renormalize .
   ```

1. Para exibir os arquivos reescritos e normalizados, execute o comando a seguir.

   ```shell copy
   git status
   ```

1. Opcionalmente, para confirmar todas alterações pendentes no repositório, execute o comando a seguir.

   ```shell copy
   git commit -m "Normalize all the line endings"
   ```

## Leitura adicional

* [Personalizando o Git – Atributos Git](https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes) no livro Pro Git
* [git-config](https://git-scm.com/docs/git-config) nas páginas de manual do Git
* [Introdução – Configuração do Git pela primeira vez](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup) no livro Pro Git
* [Mind the End of Your Line](http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/) de [Tim Clem](https://github.com/tclem)