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
autocrlf
en falso parece mucho más fácil;) stackoverflow.com/questions/2333424/…Respuestas:
La mejor explicación de cómo
core.autocrlf
funciona se encuentra en la página de manual de gitattributes , en latext
sección de atributos.Así es como
core.autocrlf
parece funcionar actualmente (o al menos desde v1.7.2 por lo que sé):core.autocrlf = true
LF
caracteres están normalizadosCRLF
en su árbol de trabajo; los archivos que contienenCRLF
en el repositorio no serán tocadosLF
caracteres en el repositorio, se normalizaron a partirCRLF
deLF
cuando vuelva a estar comprometido con el repositorio. Los archivos que contienenCRLF
en el repositorio se confirmarán intactos.core.autocrlf = input
CRLF
caracteres se normalizanLF
cuando se devuelven al repositorio.core.autocrlf = false
core.eol
dicta caracteres EOL en los archivos de texto de su árbol de trabajo.core.eol = native
de forma predeterminada, lo que significa que las EOL de Windows estánCRLF
y * nix EOL estánLF
en árboles de trabajo.gitattributes
configuración del repositorio determina la normalización de caracteres EOL para las confirmaciones en el repositorio (el valor predeterminado es la normalización de losLF
caracteres).Acabo de investigar este problema recientemente y también encuentro que la situación es muy complicada. La
core.eol
configuración definitivamente ayudó a aclarar cómo git maneja los caracteres EOL.fuente
core.autocrlf = false
, si no tengo ungitattributes
archivo, ¿significa que no habrá normalización? ¿O significa que usará la normalización predeterminada?.gitattributes
archivo tener prioridad sobre lacore.autocrlf
configuració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:
CRLF
yLF
en 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:
Como 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.autocrlf
estrue
yLF
EOL.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
CR
solo nunca se convierten.Esto significa que si una secuencia de comandos de conversión EOL mal escrita intenta convertir un archivo final mixto con
CRLF
s +LF
s, simplemente convirtiendoLF
s aCRLF
s, entonces dejará el archivo en modo mixto con "solitario"CR
donde sea queCRLF
se haya convertidoCRCRLF
.Git no convertirá nada, ni siquiera en el
true
modo, 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
input
ofalse
, 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 queinput
debe 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.eol
está agregando / evolucionando una nueva configuración :Se están considerando otras evoluciones :
git 2.8 (marzo de 2016) mejora la forma en que
core.autocrlf
influye 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.eol
se trata de "modificar automáticamente" solo lo que declaras explícitamente en un.gitattributes
archivo. Esto es diferente de locore.autocrlf
que se aplica a cualquier archivo en el repositorio. Es un proceso declarativo.git add
y no en elgit commit
momento. (Tenga en cuenta quegit commit -a
o--only
o--include
hacer 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.autocrlf
el valor no depende del tipo de sistema operativo, pero el valor predeterminado de Windows estrue
y para Linux -input
. Exploré 3 valores posibles para los casos de confirmación y pago y esta es la tabla resultante:fuente
CR
solo nunca se tocan.false
nunca toca las terminaciones de línea.true
siempre se compromete comoLF
y se retira comoCRLF
. Yinput
siempre se comprometeLF
y se retira tal como está.Aquí está mi comprensión hasta ahora, en caso de que ayude a alguien.
core.autocrlf=true
ycore.safecrlf = true
Tiene 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=false
Tiene 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=input
No 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)
:text
propiedad esSet, Set value to 'auto'
, la conversión se produce en el archivo se ha confirmado con 'CRLF'text
propiedad esUnset
: no pasa nada, enen paraCheckout
text
propiedad esUnspecified
, la conversión depende decore.autocrlf
autocrlf = 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
:text
propiedad esUnset
: no pasa nada.text
la propiedad esSet, Set value to 'auto
: dependecore.autocrlf
,core.eol
.core.eol
text
propiedad esUnspecified
, depende decore.autocrlf
.2.1
2.2
text
propiedad esUnspecified
Comportamiento por defecto
Entonces, el comportamiento predeterminado es
text
propiedad esUnspecified
ycore.autocrlf = false
:Conclusiones
text
se 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