Converter finais de linha de retornos de carro dos para feeds de linha Unix usando git

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 gite 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 gitde 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 .gitattributesarquivo, por exemplo:

# Managing line ending conversions
# See http://git-scm.com/docs/gitattributes#_end-of-line_conversion
* text=auto

Enviar .gitattributesarquivo:

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 vie verifique o formato do arquivo lido usando:

:set ff?

Converter arquivo manualmente?

Abra o arquivo vie 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