Recentemente, estive trabalhando em algum código legado que estava repleto de retornos de carruagem dos. Tentar comparar os arquivos com versões unix era impossível de usar git diff
– apenas mostrava que o arquivo inteiro era diferente.
O que eu precisava fazer era normalizar em massa as terminações de linha para que eu pudesse obter uma diferença precisa das alterações. Felizmente, é possível normalizar terminações de linha em massa com uma pequena ajuda de git
e gitattributes
.
Passos mínimos para conversão em massa de terminações de linha de DOS com git
As etapas a seguir são baseadas na minha experiência git
de conversão em massa de terminações de linha, consulte a Ajuda do GitHub para lidar com terminações de linha e Patchwork adaptativo para o fim de sua linha para explicações mais detalhadas.
Antes de começar, certifique-se de não ter nenhuma mudança não testada ou não confirmada em seu repositório porque você irá perdê-las.
Defina a configuração core.autocrlf do git, por exemplo:
git config --global core.autocrlf input
Crie o .gitattributes
arquivo, por exemplo:
# Managing line ending conversions
# See http://git-scm.com/docs/gitattributes#_end-of-line_conversion
* text=auto
Enviar .gitattributes
arquivo:
git add .gitattributes
git commit -m "Adding gitattributes file for managing line ending conversions."
Reconstrua a árvore de trabalho local, dando ao git a chance de identificar os arquivos que precisam ser convertidos:
git rm --cached -r .
git reset --hard
O Git ainda não converteu os arquivos, apenas identificou quais arquivos serão convertidos na próxima submissão. Verifique o status e confirme os arquivos que deseja que o git converta.
git status
git add .
git commit -m "Normalizing line endings with git."
Git converte as terminações de linha durante o commit. No entanto, você não verá os arquivos convertidos em sua árvore local, a menos que reconstrua:
# carriage returns still visible in local files after commit
cat -t somefile.txt
# rebuild tree letting git convert endings to your preferred format
git rm --cached -r .
git reset --hard
# carriage returns should be gone in local files after rebuild
cat -t somefile.txt
Dicas adicionais de solução de problemas
Nem todos os arquivos são convertidos?
Você pode tentar definir explicitamente as extensões de arquivo em . Ou simplesmente toque no arquivo para fazer o git reconhecer que ele precisa ser convertido:.gitattributes
# touch a single file
touch -a somefile.txt
# or recursively touch all files
find . -exec touch -a {} ;
# or recursively touch files with names matching a pattern
find . -name '*.txt' -exec touch -a {} ;
Expor personagens ocultos?
Usando cat
:
cat -v somefile.txt
cat -t somefile.txt
Verificar o formato do arquivo?
Abra o arquivo vi
e verifique o formato do arquivo lido usando:
:set ff?
Converter arquivo manualmente?
Abra o arquivo vi
e converta o arquivo usando a seguinte sequência de comandos:
:e ++ff=dos
:setlocal ff=unix
:w
Comparar arquivos ignorando retornos de carro?
diff --strip-trailing-cr somefile.txt otherfile.txt
diff -r --strip-trailing-cr somefolder otherfolder