Conversión de finales de línea de retornos de carro dos a feeds de línea Unix usando git

Recientemente estuve trabajando en un código heredado que estaba plagado de retornos de carro dos. Tratar de comparar los archivos con versiones de Unix era imposible de usar git diff, solo mostraba que todo el archivo era diferente.

Lo que tenía que hacer era normalizar de forma masiva los finales de línea para poder obtener una diferencia precisa de los cambios. Afortunadamente, es posible normalizar los finales de línea a granel con un poco de ayuda de gity gitattributes.

Pasos mínimos para la conversión masiva de terminaciones de línea DOS con git

Los siguientes pasos se basan en mi experiencia en el uso gitde la conversión masiva de finales de línea, consulte la Ayuda de GitHub Cómo lidiar con los finales de línea y Adaptive Patchwork Mind the End of Your Line para obtener explicaciones más detalladas.

Antes de comenzar, aseg√ļrese de no tener ning√ļn cambio sin etapas o sin confirmar en su repositorio porque los perder√°.

Establezca la configuración core.autocrlf de git, por ejemplo:

git config --global core.autocrlf input

Crear .gitattributesarchivo, por ejemplo:

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

Confirmar .gitattributesarchivo:

git add .gitattributes
git commit
-m "Adding gitattributes file for managing line ending conversions."

Reconstruir el árbol de trabajo local, dando a git la oportunidad de identificar archivos que necesitan conversión:

git rm --cached -r .
git reset
--hard

Git a√ļn no ha convertido los archivos, solo ha identificado qu√© archivos se convertir√°n la pr√≥xima vez que confirme. Verifique el estado y confirme los archivos que desea que git convierta.

git status
git
add .
git commit
-m "Normalizing line endings with git."

Git convierte los finales de línea durante la confirmación. Sin embargo, no verá los archivos convertidos en su árbol local a menos que reconstruya:

# 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

Consejos adicionales para la resolución de problemas

¬ŅNo se convierten todos los archivos?

Puede intentar configurar explícitamente las extensiones de archivo en . O simplemente toque el archivo para que git reconozca que necesita conversión:.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 {} ;

¬ŅExponer personajes ocultos?

Usando cat:

cat -v somefile.txt
cat
-t somefile.txt

¬ŅComprobar formato de archivo?

Abra el archivo viy verifique el formato de archivo de lectura usando:

:set ff?

¬ŅConvertir archivo manualmente?

Abra el archivo viy conviértalo usando la siguiente secuencia de comandos:

:e ++ff=dos
:setlocal ff=unix
:w

¬ŅComparar archivos ignorando los retornos de carro?

diff --strip-trailing-cr somefile.txt otherfile.txt
diff
-r --strip-trailing-cr somefolder otherfolder