Git hace que todos los files desprotegidos finalicen la línea CRLF

Estoy progtwigndo en mac, y realmente no entiendo lo que hace Git con el final de línea de mis files:

Creé un repository con algunos files en formatting Unix (fin de línea LF) .

Cuando clono el repository que creé, todas mis líneas finales son CRLF . ¿No debería detectar automáticamente que necesito LF al final de la línea?

Tengo autoclrf establecido en verdadero.

La documentation de GIT sobre autoclrf es bastante difícil de entender:

Si simplemente desea tener terminaciones de línea CRLF en su directory de trabajo, independientemente del repository con el que esté trabajando, puede establecer la variable de configuration "core.autocrlf" sin cambiar ningún atributo.

[núcleo]

autocrlf = true 

Esto no obliga a la normalización de todos los files de text, pero sí garantiza que los files de text que introduzca en el repository tengan sus finales de línea normalizados en LF cuando se agreguen y que los files que ya están normalizados en el repository permanezcan normalizados.

La primera oración dice "si quieres tener todo crlf", cuando la segunda oración dice que git ajustará automáticamente el final de las líneas.

En mi caso, parece que Git convierte todo en CRLF y lo deja así cuando trato de clonar.

La página de manual de gitattributes está mal diseñada. En una sección posterior, encontrarás:

La variable de configuration core.eol controla qué finales de línea usará git para los files normalizados en su directory de trabajo; el valor pnetworkingeterminado es usar la terminación de línea nativa para su plataforma, o CRLF si se establece core.autocrlf .

Entonces, a less que haya especificado core.eol , terminará con líneas terminadas por caracteres CR + LF independientemente de si está usando Apple Mac OS X, Microsoft Windows o Ubuntu Linux.

De tu pregunta:

La primera oración dice "si quieres tener todo crlf", cuando la segunda oración dice que git ajustará automáticamente el final de las líneas.

Es importante tener en count que hay dos direcciones de ajuste que se realizan cuando core.autocrlf se establece en true :

  • CR + LF se convertirán en LF en su repository / repository . Es decir, los files de commit y el back-end del repository tendrán LF al final de las líneas en los files de text. Esto mantiene las cosas consistentes en su historial de compromisos, facilitando las comparaciones / diffs si uno de los IDEs de sus compañeros de trabajo decide convertir mágicamente sus LF a CR + LF (¿quién quiere ver eso en su diff?). Ahorrará algunos bytes de espacio en el disco duro, supongo.
  • Los LF se convertirán en CR + LF en su directory de trabajo . En su sistema de files desprotegido, cualquier file de text nuevo tendrá líneas que terminen en CR + LF una vez que lo toque. Esto sucederá incluso si el file tenía líneas que terminan en LF simple cuando lo creó por primera vez.

Lo primero que debe hacer es desarmar core.autocrlf o configurarlo en false . Si luego desea que los files de text extraídos se ajusten a las terminaciones de línea preferidas por el usuario del sistema operativo, independientemente de cómo se crearon, solo agréguele esto a su .gitattributes:

 * text=auto 

Alternativamente, si git no es bueno para adivinar cuál de tus files es text, podrías declarar una extensión específica para someterse a esta normalización bidireccional:

 *.ext text 

(donde ext es la extensión de file en cuestión)

Cuando establece core.autocrlf en true , Git convierte los finales de línea a LF cuando se compromete con el repository, pero escribe los files en el tree de trabajo utilizando los finales de línea apropiados para la configuration de su plataforma ( LF en Mac / Unix / Linux, CRLF en Windows )

Sí, debería ver CRLF en su tree de trabajo en Windows cuando autocrlf está establecido en verdadero, lo que incluye si está navegando por el explorador. Si accedes a un repository de Linux, deberías ver que todos tus files finalicen correctamente con LF.