Skip to main content

Configurar Git para manejar finales de línea

Para evitar problemas en tus diferencias, puedes configurar Git para manejar correctamente los finales de línea.

Platform navigation

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 a CRLF durante la restauración. Debe usar esto para los archivos que tienen que conservar los finales CRLF, incluso en OSX o Linux.

  • text eol=lf Git siempre convertirá los finales de línea a LF 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 valor binary 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.

  1. 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.

  2. 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"
    
  3. 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
    
  4. Para mostrar los archivos reescritos y normalizados, ejecuta el siguiente comando.

    Shell
    git status
    
  5. Opcionalmente, para confirmar los cambios pendientes en el repositorio, ejecuta el siguiente comando.

    Shell
    git commit -m "Normalize all the line endings"
    

Información adicional