git diff muestra que el file completo ha cambiado para un solo cambio de línea, pero solo para algunos files en un directory

Me he encontrado con un problema extraño en GIT . Recientemente, nuestra base de código se ha movido a GIT desde SVN. Entonces, cuando he clonado el repository en mi local y estoy haciendo un cambio de línea única en un file, git diff muestra que el file completo ha cambiado (primero todo el contenido ha sido eliminado y luego todo el contenido agregado nuevamente). Pero lo extraño es que no está sucediendo para todos los files.

Por ejemplo, he cambiado (p. ej., agregado un espacio después de una línea) mi app.js , index.html y gruntfile.js donde muestra la diferencia de línea correcta para app.js y el cambio de file completo para index.html y gruntfile.js

He referido muchos artículos de stackoverflow y configuré core.autocrlf en true y false pero ninguno de los ajustes funcionó.

Otra cosa extraña es que no puedo restablecer ese file también. Supongamos en el ejemplo anterior si hago un git reset --hard , no elimina / revierte los files git reset --hard de mi local, aquí se revierte app.js pero otros dos no se revierten. Finalmente tuve que usar git checkout . para revertir todos los files.

Actualización: este es mi contenido de file .gitattribute en el directory raíz. * text=auto

Y este es mi file .editorconfig en el directory raíz.

 root = true [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.md] trim_trailing_whitespace = false 

Esto me parece un problema con las terminaciones de línea CRLF vs LF.

Creo que SVN y GIT almacenan files de text en sus repositorys con terminaciones de línea LF, y que ambos convierten entre las terminaciones de líneas LF y CRLF cuando revisan los files dentro y fuera del repository de la copy de trabajo.

Lamentablemente, SVN y GIT tienen distintas forms de decidir qué files son files de text, por lo que no siempre coinciden en si se requiere una conversión de final de línea.

GIT es bastante bueno para adivinar, pero permite controlar el uso de attributes; ejecuta "attributes de ayuda de git" para get una explicación.

SVN usa las properties de svn en files individuales, y estas properties deben configurarse manualmente o bien a través de las reglas de autopropósitos configuradas.

Supongo que los files fueron originalmente asignados a SVN en Windows, que está ejecutando GIT en Windows, y que creó el repository de GIT usando "git svn".

Si es así, mi mejor suposition es que su repository SVN no tenía properties svn establecidas, por lo que SVN almacenaba files con terminaciones de líneas CRLF en el repository SVN sin conversión. Si luego importó el repository SVN en un nuevo repository GIT con "git svn", entonces el repository GIT también contendrá los finales de línea CRLF. Este no es el formatting esperado para los files de text en el repository de GIT, por lo que puede causar problemas. En particular, creo que "git diff" compara lo que ya está en el repository (con terminaciones de línea CRLF) con lo que se comprometería con el repository (con terminaciones de línea LF) y encuentra que cada línea es diferente.

Una forma de entender lo que está pasando sería clonar el repository en una máquina Linux con core.autocrlf = false (o no configurado). En este caso, no habría ninguna conversión de final de línea CRLF para confundir el asunto, y podría ver cuáles son las terminaciones de línea en los files desprotegidos. Supongo que tendrán terminaciones de línea CRLF debido a las terminaciones de línea CRLF almacenadas en el repository GIT.

Si mi hipótesis es correcta, entonces creo que tienes 2 opciones:

(1) Arregle el repository de GIT para que contenga LF en lugar de terminaciones de línea CRLF. En Windows (con core.autocrlf = true), creo que puede hacer esto tocando todos los files (sin hacer ningún cambio), luego ingrese todos los files que los informes de GIT han cambiado. En Linux (con core.autocrlf = false) creo que podrías hacerlo ejecutando dos2unix en todos los files de text y luego enviándolos.

(2) Trate todos los files como binarys en lugar de text para que GIT no intente la conversión de terminación de línea en absoluto. Creo que puedes hacer esto al enviar un file .gitattributes que contenga "* -text" (sin las comillas). La desventaja de esto es que obtendrás terminaciones de línea CRLF cuando visites Linux.