He leído muchas preguntas y respuestas diferentes sobre Stack Overflow, así como documentación de git sobre cómo funciona la configuración core.autocrlf .
Este es mi entendimiento de lo que he leído:
Los clientes Unix y Mac OSX (pre-OSX usan CR) usan terminaciones de línea LF.
Los clientes de Windows usan finales de línea CRLF.
Cuando core.autocrlf se establece en verdadero en el cliente, el repositorio de git siempre almacena archivos en formato de terminación de línea LF y las terminaciones de línea en archivos en el cliente se convierten de un lado a otro al finalizar / confirmar para clientes (es decir, Windows) que usan -LF terminaciones de línea, sin importar el formato que tengan los archivos de terminación de línea en el cliente (esto no está de acuerdo con la definición de Tim Clem; consulte la actualización a continuación).
Aquí hay una matriz que intenta documentar lo mismo para la configuración de 'entrada' y 'falsa' de core.autocrlf con signos de interrogación donde no estoy seguro del comportamiento de conversión de final de línea.
Mis preguntas son:
- ¿Cuáles deberían ser los signos de interrogación?
- ¿Es esta matriz correcta para los "signos que no son de interrogación"?
Actualizaré los signos de interrogación de las respuestas a medida que se forme un consenso.
valor core.autocrlf
entrada verdadera falsa
-------------------------------------------------- --------
cometer | convertir? ?
nuevo | a LF (¿convertir a LF?) (¿sin conversión?)
cometer | convertir a ? No
existente | Conversión de LF (¿convertir a LF?)
pago | convertir a ? No
existente | Conversión CRLF (¿sin conversión?)
Realmente no estoy buscando opiniones sobre los pros y los contras de los diversos entornos. Solo estoy buscando datos que aclaren cómo esperar que git funcione con cada una de las tres configuraciones.
-
Actualización 17/04/2012 : Después de leer el artículo de Tim Clem vinculado por JJD en los comentarios, modifiqué algunos de los valores en los valores "desconocidos" en la tabla anterior, así como también cambié "pago existente | verdadero para convertir a CRLF en lugar de convertir a cliente ". Aquí están las definiciones que da, que son más claras que cualquier cosa que haya visto en otros lugares:
core.autocrlf = false
Este es el valor predeterminado, pero se alienta a la mayoría de las personas a cambiar esto inmediatamente. El resultado del uso de false es que Git nunca se mete con las terminaciones de línea en su archivo. Puede registrar archivos con LF o CRLF o CR o alguna combinación aleatoria de esos tres y a Git no le importa. Esto puede hacer que las diferencias sean más difíciles de leer y las fusiones sean más difíciles. La mayoría de las personas que trabajan en un mundo Unix / Linux usan este valor porque no tienen problemas de CRLF y no necesitan que Git haga un trabajo adicional cada vez que los archivos se escriben en la base de datos de objetos o se escriben en el directorio de trabajo.
core.autocrlf = true
Esto significa que Git procesará todos los archivos de texto y se asegurará de que CRLF se reemplace con LF al escribir ese archivo en la base de datos de objetos y volverá a convertir todos los LF en CRLF al escribir en el directorio de trabajo. Esta es la configuración recomendada en Windows porque garantiza que su repositorio se pueda usar en otras plataformas mientras conserva CRLF en su directorio de trabajo.
core.autocrlf = input
Esto significa que Git procesará todos los archivos de texto y se asegurará de que CRLF se reemplace con LF al escribir ese archivo en la base de datos de objetos. Sin embargo, no hará lo contrario. Cuando vuelva a leer los archivos de la base de datos de objetos y los escriba en el directorio de trabajo, seguirán teniendo LF para indicar el final de la línea. Esta configuración se usa generalmente en Unix / Linux / OS X para evitar que los CRLF se escriban en el repositorio. La idea es que si pega el código de un navegador web y accidentalmente obtiene CRLF en uno de sus archivos, Git se aseguraría de que fueran reemplazados por LF cuando escribiera en la base de datos de objetos.
El artículo de Tim es excelente, lo único que se me ocurre es que él asume que el repositorio está en formato LF, lo cual no es necesariamente cierto, especialmente para proyectos de Windows.
La comparación del artículo de Tim con la respuesta más votada hasta la fecha por jmlane muestra un acuerdo perfecto sobre la configuración verdadera y de entrada y el desacuerdo sobre la configuración falsa.
fuente

autocrlfen falso parece mucho más fácil;) stackoverflow.com/questions/2333424/…Respuestas:
La mejor explicación de cómo
core.autocrlffunciona se encuentra en la página de manual de gitattributes , en latextsección de atributos.Así es como
core.autocrlfparece funcionar actualmente (o al menos desde v1.7.2 por lo que sé):core.autocrlf = trueLFcaracteres están normalizadosCRLFen su árbol de trabajo; los archivos que contienenCRLFen el repositorio no serán tocadosLFcaracteres en el repositorio, se normalizaron a partirCRLFdeLFcuando vuelva a estar comprometido con el repositorio. Los archivos que contienenCRLFen el repositorio se confirmarán intactos.core.autocrlf = inputCRLFcaracteres se normalizanLFcuando se devuelven al repositorio.core.autocrlf = falsecore.eoldicta caracteres EOL en los archivos de texto de su árbol de trabajo.core.eol = nativede forma predeterminada, lo que significa que las EOL de Windows estánCRLFy * nix EOL estánLFen árboles de trabajo.gitattributesconfiguración del repositorio determina la normalización de caracteres EOL para las confirmaciones en el repositorio (el valor predeterminado es la normalización de losLFcaracteres).Acabo de investigar este problema recientemente y también encuentro que la situación es muy complicada. La
core.eolconfiguración definitivamente ayudó a aclarar cómo git maneja los caracteres EOL.fuente
core.autocrlf = false, si no tengo ungitattributesarchivo, ¿significa que no habrá normalización? ¿O significa que usará la normalización predeterminada?.gitattributesarchivo tener prioridad sobre lacore.autocrlfconfiguración?El tema de las EOL en proyectos de plataforma mixta ha hecho que mi vida sea miserable durante mucho tiempo. Los problemas suelen surgir cuando ya hay archivos con diferentes y mixtos EOLs ya en el repositorio. Esto significa que:
CRLFyLFen el mismo archivo.Cómo sucede esto no es el problema aquí, pero sucede.
Ejecuté algunas pruebas de conversión en Windows para los diversos modos y sus combinaciones.
Esto es lo que obtuve, en una tabla ligeramente modificada:
El | Conversión resultante cuando | Conversión resultante cuando El | comprometer archivos con varios | echando un vistazo desde el repositorio - El | EOLs EN repo y | con archivos mixtos y El | valor core.autocrlf: | valor core.autocrlf: -------------------------------------------------- ------------------------------ Archivo | cierto | entrada | falso | cierto | entrada | falso -------------------------------------------------- ------------------------------ Windows-CRLF | CRLF -> LF | CRLF -> LF | tal cual | tal cual | tal cual | como es Unix -LF | tal cual | tal cual | tal cual | LF -> CRLF | tal cual | como es Mac -CR | tal cual | tal cual | tal cual | tal cual | tal cual | como es Mixto-CRLF + LF | tal cual | tal cual | tal cual | tal cual | tal cual | como es Mixto-CRLF + LF + CR | tal cual | tal cual | tal cual | tal cual | tal cual | como esComo puede ver, hay 2 casos en los que la conversión ocurre en commit (3 columnas a la izquierda). En el resto de los casos, los archivos se confirman tal cual.
Al finalizar la compra (3 columnas a la derecha), solo hay 1 caso donde la conversión ocurre cuando:
core.autocrlfestrueyLFEOL.Lo más sorprendente para mí, y sospecho, la causa de muchos problemas de EOL es que no hay una configuración en la que se normalicen EOL mixtos como
CRLF+LF.Tenga en cuenta también que las EOL de Mac "antiguas" de
CRsolo nunca se convierten.Esto significa que si una secuencia de comandos de conversión EOL mal escrita intenta convertir un archivo final mixto con
CRLFs +LFs, simplemente convirtiendoLFs aCRLFs, entonces dejará el archivo en modo mixto con "solitario"CRdonde sea queCRLFse haya convertidoCRCRLF.Git no convertirá nada, ni siquiera en el
truemodo, y continúa el caos EOL. Esto realmente me sucedió y desordenó mis archivos realmente mal, ya que a algunos editores y compiladores (por ejemplo, VS2010) no les gustan las EOL de Mac.Supongo que la única forma de manejar realmente estos problemas es normalizar ocasionalmente todo el repositorio revisando todos los archivos en modo
inputofalse, ejecutando una normalización adecuada y volviendo a confirmar los archivos modificados (si los hay). En Windows, presumiblemente reanude el trabajo concore.autocrlf true.fuente
core.autocrlf true. Personalmente, creo queinputdebe usarse siempre.Las cosas están a punto de cambiar en el frente de "conversión eol", con el próximo Git 1.7.2 :
Se
core.eolestá agregando / evolucionando una nueva configuración :Se están considerando otras evoluciones :
git 2.8 (marzo de 2016) mejora la forma en que
core.autocrlfinfluye en la eol:Consulte commit 817a0c7 (23 de febrero de 2016), commit 6e336a5 , commit df747b8 , commit df747b8 (10 de febrero de 2016), commit df747b8 , commit df747b8 (10 de febrero de 2016) y commit 4b4024f , commit bb211b4 , commit 92cce13 , commit 320d39c , commit 4b4024f , commit 4b4024f commit bb211b4 , commit 92cce13 , commit 320d39c (05 de febrero de 2016) por Torsten Bögershausen (
tboegi) .(Fusionada por Junio C Hamano -
gitster- en commit c6b94eb26 de febrero de 2016)Como torek agrega en los comentarios :
Para obtener más información al respecto, consulte " Cuál es la diferencia entre autocrlf y eol ".
fuente
core.eolse trata de "modificar automáticamente" solo lo que declaras explícitamente en un.gitattributesarchivo. Esto es diferente de locore.autocrlfque se aplica a cualquier archivo en el repositorio. Es un proceso declarativo.git addy no en elgit commitmomento. (Tenga en cuenta quegit commit -ao--onlyo--includehacer archivos de complemento al índice en ese momento, sin embargo.) Por lo que vale, tú, yo y Linus Torvalds todos odian la idea de un VCS vez modificando lo que se ha comprometido. Pero hay todos esos usuarios de Windows ... :-)core.autocrlfel valor no depende del tipo de sistema operativo, pero el valor predeterminado de Windows estruey para Linux -input. Exploré 3 valores posibles para los casos de confirmación y pago y esta es la tabla resultante:fuente
CRsolo nunca se tocan.falsenunca toca las terminaciones de línea.truesiempre se compromete comoLFy se retira comoCRLF. Yinputsiempre se comprometeLFy se retira tal como está.Aquí está mi comprensión hasta ahora, en caso de que ayude a alguien.
core.autocrlf=trueycore.safecrlf = trueTiene un repositorio donde todas las terminaciones de línea son iguales , pero trabaja en diferentes plataformas. Git se asegurará de que las terminaciones de sus líneas se conviertan en las predeterminadas para su plataforma. ¿Por qué importa esto? Digamos que crea un nuevo archivo. El editor de texto en su plataforma utilizará sus finales de línea predeterminados. Cuando lo registra, si no tiene core.autocrlf establecido en verdadero, ha introducido una inconsistencia de final de línea para alguien en una plataforma que por defecto es un final de línea diferente. Siempre configuro safecrlf también porque me gustaría saber que la operación crlf es reversible. Con estas dos configuraciones, git está modificando sus archivos, pero verifica que las modificaciones sean reversibles .
core.autocrlf=falseTiene un repositorio que ya tiene terminaciones de línea mixtas registradas y corregir las terminaciones de línea incorrectas podría romper otras cosas. Es mejor no decirle a Git que convierta las terminaciones de línea en este caso, porque entonces exacerbará el problema que fue diseñado para resolver, haciendo que las diferencias sean más fáciles de leer y las fusiones sean menos dolorosas. Con esta configuración, git no modifica sus archivos .
core.autocrlf=inputNo uso esto porque la razón de esto es para cubrir un caso de uso en el que creó un archivo que tiene terminaciones de línea CRLF en una plataforma que por defecto tiene terminaciones de línea LF. En cambio, prefiero que mi editor de texto siempre guarde nuevos archivos con los valores predeterminados de final de línea de la plataforma.
fuente
No, la respuesta de @jmlane es incorrecta.
Para
Checkin (git add, git commit):textpropiedad esSet, Set value to 'auto', la conversión se produce en el archivo se ha confirmado con 'CRLF'textpropiedad esUnset: no pasa nada, enen paraCheckouttextpropiedad esUnspecified, la conversión depende decore.autocrlfautocrlf = input or autocrlf = true, la conversión solo ocurre cuando el archivo en el repositorio es 'LF', si ha sido 'CRLF', no pasará nada.autocrlf = false, no pasa nadaPara
Checkout:textpropiedad esUnset: no pasa nada.textla propiedad esSet, Set value to 'auto: dependecore.autocrlf,core.eol.core.eoltextpropiedad esUnspecified, depende decore.autocrlf.2.12.2textpropiedad esUnspecifiedComportamiento por defecto
Entonces, el comportamiento predeterminado es
textpropiedad esUnspecifiedycore.autocrlf = false:Conclusiones
textse establece la propiedad, el comportamiento de registro depende de sí mismo, no de autocrlffuente
Hice algunas pruebas tanto en Linux como en Windows. Utilizo un archivo de prueba que contiene líneas que terminan en LF y también líneas que terminan en CRLF.
El archivo se confirma, se elimina y luego se retira. El valor de core.autocrlf se establece antes de la confirmación y también antes del pago. El resultado está abajo.
fuente