Acerca de los finales de línea
Cada vez que presiona Entrar en el teclado, se inserta un carácter invisible denominado fin de línea. Esto se maneja de forma diferente en los diferentes sistemas operativos.
Cuando colaboras en proyectos con Git y GitHub, Git podría producir resultados inesperados si, por ejemplo, estás trabajando en una máquina Windows y tu colaborador hizo cambios en macOS.
Puedes configurar Git para que maneje los fines de línea automáticamente y así puedas colaborar eficazmente con las personas que utilizan otros sistemas operativos.
Parámetros globales para finales de línea
El comando git config core.autocrlf
se usa para cambiar cómo controla Git los finales de línea. Toma un solo argumento.
En macOS, simplemente pase input
a la configuración. Por ejemplo:
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS
En Windows, simplemente pase true
a la configuración. Por ejemplo:
$ 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.
En Linux, simplemente pase input
a la configuración. Por ejemplo:
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux
Parámetros por repositorio
Opcionalmente, puede configurar un archivo .gitattributes
para administrar cómo lee Git los fines de línea en un repositorio concreto. Al confirmar este archivo en un repositorio, invalida el valor core.autocrlf
de todos los colaboradores del repositorio. Esto garantiza un comportamiento consistente para todos los usuarios, sin importar su configuración y ambiente de Git.
El archivo .gitattributes
se debe crear en la raíz del repositorio y confirmarse como cualquier otro archivo.
Un archivo .gitattributes
es similar a una tabla con dos columnas:
- A la izquierda está el nombre del archivo que coincide con Git.
- A la derecha está la configuración de fin de línea que Git debería usar para esos archivos.
Ejemplo
Este es un archivo .gitattributes
de ejemplo. Puedes usarlo como plantilla para tus repositorios:
# 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
Observará que los archivos se comparan (*.c
, *.sln
, *.png
) separados por un espacio y, después, se les asigna un valor (text
, text eol=crlf
, binary
). Revisaremos algunas configuraciones posibles a continuación.
-
text=auto
Git administrará los archivos de la manera que considere óptima. Esta es una buena opción predeterminada. -
text eol=crlf
Git siempre convertirá los finales de línea aCRLF
durante la restauración. Debe usar esto para los archivos que tienen que conservar los finalesCRLF
, incluso en OSX o Linux. -
text eol=lf
Git siempre convertirá los finales de línea aLF
durante la restauración. Deberías usar esto para los archivos que deben conservar los finales LF, incluso en Windows. -
binary
Git comprenderá que los archivos especificados no son de texto y no debería intentar cambiarlos. El valorbinary
también es un alias para-text -diff
.
Actualizar un repositorio después de los finales de línea
Después de establecer la opción core.autocrlf
o confirmar un archivo .gitattributes
, Git cambia automáticamente los finales de línea para que coincidan con la nueva configuración. Puedes encontrarte con que Git informa de cambios en archivos que no has modificado.
Para asegurarte de que todos los finales de línea del repositorio coincidan con la nueva configuración, realiza una copia de seguridad de los archivos con Git y, a continuación, quita y restaura todos los archivos para normalizar los finales de línea.
-
Antes de agregar o confirmar los cambios, comprueba que Git ha aplicado correctamente la configuración. Por ejemplo, Git determina automáticamente si los archivos de un repositorio son archivos binarios o de texto. Para evitar daños en los archivos binarios del repositorio, se recomienda marcar explícitamente los archivos como binarios en
.gitattributes
. Para más información, consulta gitattributes: definición de atributos por ruta de acceso en la documentación de Git. -
Para evitar la pérdida de los cambios locales en los archivos del repositorio, agrega y confirma los cambios pendientes mediante la ejecución de los siguientes comandos.
Shell git add . -u git commit -m "Saving files before refreshing line endings"
git add . -u git commit -m "Saving files before refreshing line endings"
-
Para actualizar todos los archivos de la rama actual para reflejar la nueva configuración, ejecuta los siguientes comandos.
Shell git rm -rf --cached . git reset --hard HEAD
git rm -rf --cached . git reset --hard HEAD
-
Para mostrar los archivos reescritos y normalizados, ejecuta el siguiente comando.
Shell git status
git status
-
Opcionalmente, para confirmar los cambios pendientes en el repositorio, ejecuta el siguiente comando.
Shell git commit -m "Normalize all the line endings"
git commit -m "Normalize all the line endings"
Información adicional
- Personalización de Git: Atributos de Git en el libro Pro Git
- git-config en las páginas man de Git
- Introducción: Configuración inicial de Git en el libro Pro Git
- Mind the End of Your Line (Cuidado con los finales de línea) de Tim Clem