not have from for endings crlf changed change autocrlf git github eol

git - for - line endings have changed from lf to crlf



Force LF eol en git repo y copia de trabajo (3)

Comenzando con git 2.10, no es necesario enumerar cada archivo de texto por separado. Git 2.10 resolvió el comportamiento de text = auto junto con eol = lf . Source

.gitattributes archivo en la raíz de su repositorio de git:

* text=auto eol=lf

Agregar y confirmarlo.

Luego, puede seguir los pasos y todos los archivos están normalizados ahora:

git rm --cached -r . # Remove every file from git''s index. git reset --hard # Rewrite git''s index to pick up all the new line endings.

Fuente: Respuesta de kenorb .

Tengo un repositorio git alojado en github. Muchos de los archivos se desarrollaron inicialmente en Windows, y no tuve demasiado cuidado con los finales de línea. Cuando realicé la confirmación inicial, tampoco tuve ninguna configuración de git para imponer los finales de línea correctos. El resultado es que tengo varios archivos con terminaciones de líneas CRLF en mi repositorio github.

Ahora estoy desarrollando parcialmente en Linux, y me gustaría limpiar los finales de línea. ¿Cómo puedo asegurarme de que los archivos están almacenados correctamente con LF en github y tengo LF en mi copia de trabajo?

He configurado un archivo .gitattributes que contiene el text eol=LF ; ¿Es eso correcto? Con eso comprometido y empujado, ¿puedo rm mi repositorio local y volver a clonar desde github para obtener el efecto deseado?


Para forzar terminaciones de línea LF para todos los archivos de texto, puede crear .gitattributes archivo .gitattributes en el nivel superior de su repositorio con las siguientes líneas (cámbielas como desee):

# Ensure all C and PHP files use LF. *.c eol=lf *.php eol=lf

lo que garantiza que todos los archivos que Git considera que son archivos de texto tienen terminaciones de línea normalizadas ( LF ) en el repositorio (normalmente los controles de configuración de core.eol tienen uno por defecto).

En base a la nueva configuración de atributos, cualquier archivo de texto que contenga CRLF debe ser normalizado por Git. Si esto no ocurre automáticamente, puede actualizar un repositorio de forma manual después de cambiar los finales de línea, para que pueda volver a escanear y confirmar el directorio de trabajo siguiendo los pasos siguientes (dado el directorio de trabajo limpio):

$ echo "* text=auto" >> .gitattributes $ rm .git/index # Remove the index to force Git to $ git reset # re-scan the working directory $ git status # Show files that will be normalized $ git add -u $ git add .gitattributes $ git commit -m "Introduce end-of-line normalization"

o según los documentos de GitHub :

git add . -u git commit -m "Saving files before refreshing line endings" git rm --cached -r . # Remove every file from Git''s index. git reset --hard # Rewrite the Git index to pick up all the new line endings. git add . # Add all your changed files back, and prepare them for a commit. git commit -m "Normalize all the line endings" # Commit the changes to your repository.

Ver también: @Charles Bailey post .

Además, si desea excluir cualquier archivo para que no se trate como un texto, desactive su atributo de texto, por ej.

manual.pdf -text

O márcalo explícitamente como binario:

# Denote all files that are truly binary and should not be modified. *.png binary *.jpg binary

Para ver un archivo de normalización de git más avanzado, compruebe .gitattributes en el núcleo de Drupal :

# Drupal git normalization # @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html # @see https://www.drupal.org/node/1542048 # Normally these settings would be done with macro attributes for improved # readability and easier maintenance. However macros can only be defined at the # repository root directory. Drupal avoids making any assumptions about where it # is installed. # Define text file attributes. # - Treat them as text. # - Ensure no CRLF line-endings, neither on checkout nor on checkin. # - Detect whitespace errors. # - Exposed by default in `git diff --color` on the CLI. # - Validate with `git diff --check`. # - Deny applying with `git apply --whitespace=error-all`. # - Fix automatically with `git apply --whitespace=fix`. *.config text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.css text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.dist text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.engine text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.html text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html *.inc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.js text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.json text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.lock text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.map text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.md text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.module text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.php text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.po text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.script text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.sh text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.sql text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.svg text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.theme text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php *.twig text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.txt text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.xml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.yml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 # Define binary file attributes. # - Do not treat them as text. # - Include binary diff in patches instead of "binary files differ." *.eot -text diff *.exe -text diff *.gif -text diff *.gz -text diff *.ico -text diff *.jpeg -text diff *.jpg -text diff *.otf -text diff *.phar -text diff *.png -text diff *.svgz -text diff *.ttf -text diff *.woff -text diff *.woff2 -text diff

Ver también:


Sin un poco de información sobre qué archivos están en su repositorio (código fuente puro, imágenes, ejecutables, ...), es un poco difícil responder la pregunta :)

Además de esto, consideraré que está dispuesto a usar LF como extremo de línea en su directorio de trabajo porque está dispuesto a asegurarse de que los archivos de texto tengan terminaciones de línea LF en su repositorio .git, ya sea que trabaje en Windows o Linux. . De hecho, es más seguro que lamentar ...

Sin embargo, hay una mejor alternativa: Benefíciese de las terminaciones de línea LF en su disco de trabajo de Linux, las terminaciones de línea CRLF en su workdir de Windows Y las terminaciones de línea LF en su repositorio.

Como está trabajando parcialmente en Linux y Windows, asegúrese de que core.eol esté configurado en native y core.autocrlf en true .

Luego, reemplace el contenido de su archivo .gitattributes con el siguiente

* text=auto

Esto permitirá que Git maneje la conversión de terminaciones de línea automágicas para ti, en los commit y checkouts. Los archivos binarios no se modificarán, los archivos detectados como archivos de texto verán las terminaciones de líneas convertidas sobre la marcha.

Sin embargo, como conoce el contenido de su repositorio, puede ayudarlo a detectar los archivos de texto de los archivos binarios.

Siempre que trabaje en un proyecto de procesamiento de imágenes basado en C, reemplace el contenido de su archivo .gitattributes con el siguiente

* text=auto *.txt text *.c text *.h text *.jpg binary

Esto asegurará que los archivos cuya extensión sea c, h o txt se almacenen con terminaciones de línea LF en su repositorio y que tengan terminaciones de línea nativas en el directorio de trabajo. Los archivos JPEG no se tocarán. Todos los demás se beneficiarán del mismo filtrado automático que se ha visto anteriormente.

Con el fin de obtener una comprensión más profunda de los detalles internos de todo esto, te sugiero que te sumerjas en este muy buen post de "Mind the end of your line" de Tim Clem, un Githubber.

Como un ejemplo del mundo real, también puede echar un vistazo a este commit donde se .gitattributes los cambios a un archivo .gitattributes .

ACTUALIZAR a la respuesta teniendo en cuenta el siguiente comentario

En realidad, no quiero CRLF en mis directorios de Windows, porque mi entorno Linux es en realidad una VirtualBox que comparte el directorio de Windows

Tiene sentido. Gracias por la aclaración. En este contexto específico, el archivo .gitattributes por sí solo no será suficiente.

Ejecute los siguientes comandos en su repositorio

$ git config core.eol lf $ git config core.autocrlf input

Como su repositorio se comparte entre su entorno Linux y Windows, esto actualizará el archivo de configuración local para ambos entornos. core.eol se asegurará de que los archivos de texto tengan terminaciones de línea LF en las cajas. core.autocrlf asegurará que el CRLF potencial en los archivos de texto (resultado de una operación de copiar / pegar, por ejemplo) se convierta a LF en su repositorio.

Opcionalmente, puede ayudar a Git a distinguir qué es un archivo de texto creando un archivo .gitattributes que contenga algo similar a lo siguiente:

# Autodetect text files * text=auto # ...Unless the name matches the following # overriding patterns # Definitively text files *.txt text *.c text *.h text # Ensure those won''t be messed up with *.jpg binary *.data binary

Si decidió crear un archivo .gitattributes , .gitattributes .

Por último, asegúrese de que el git status menciona "no hay nada que confirmar (limpieza del directorio de trabajo)" , luego realice la siguiente operación

$ git checkout-index --force --all

Esto recreará tus archivos en tu directorio de trabajo, teniendo en cuenta tus cambios de configuración y el archivo .gitattributes y reemplazando cualquier posible CRLF que .gitattributes alto en tus archivos de texto.

Una vez hecho esto, cada archivo de texto en su directorio de trabajo tendrá terminaciones de línea LF y el git status aún debería considerar el disco de trabajo como limpio.