Meu procedimento para lidar com os finais de linha é o seguinte (batalha testada em vários repositórios):
Ao criar um novo repositório:
- coloque
.gitattributes
o primeiro commit junto com outros arquivos típicos como .gitignore
eREADME.md
Ao lidar com um repo existente:
- Criar / modificar de
.gitattributes
acordo
git commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
( --no-verify
é para pular ganchos de pré-confirmação)
- Eu tenho que fazê-lo com frequência suficiente para defini-lo como um alias
alias fixCRLF="..."
- repita o comando anterior
- sim, é vodu, mas geralmente tenho que executar o comando duas vezes, primeira vez que normaliza alguns arquivos, segunda vez ainda mais arquivos. Geralmente é provavelmente melhor repetir até que nenhum novo commit seja criado :)
- ir e voltar entre o antigo (pouco antes da normalização) e o novo ramo algumas vezes. Depois de mudar o ramo, às vezes o git encontrará ainda mais arquivos que precisam ser renormalizados!
Em .gitattributes
Eu declaro todos os arquivos de texto explicitamente como tendo LF EOL, pois geralmente as ferramentas do Windows são compatíveis com o LF, enquanto as ferramentas que não são do Windows não são compatíveis com o CRLF (mesmo muitas ferramentas de linha de comando nodejs assumem o LF e, portanto, podem alterar o EOL em seus arquivos).
Conteúdo de .gitattributes
Meu .gitattributes
geralmente se parece com:
*.html eol=lf
*.js eol=lf
*.json eol=lf
*.less eol=lf
*.md eol=lf
*.svg eol=lf
*.xml eol=lf
Para descobrir quais extensões distintas são rastreadas pelo git no repo atual, veja aqui
Problemas após normalização
Feito isso, há mais uma ressalva comum.
Diga que você master
já está atualizado e normalizado e faça o checkout outdated-branch
. Muitas vezes, logo após verificar essa ramificação, o git marca muitos arquivos como modificados.
A solução é fazer um commit falso ( git add -A . && git commit -m 'fake commit'
) e depois git rebase master
. Após o rebase, o commit falso deve desaparecer.