Ejecutando git en una máquina con Windows XP, usando bash. Exporté mi proyecto desde SVN y luego cloné un repositorio desnudo.
Luego pegué la exportación en el directorio de repositorios desnudos e hice un:
git add -A
Luego recibí una lista de mensajes que decía:
LF será reemplazado por CRLF
¿Cuáles son las ramificaciones de esta conversión? Esta es una solución .NET en Visual Studio.
Respuestas:
Estos mensajes se deben a un valor predeterminado incorrecto de
core.autocrlf
en Windows.El concepto de
autocrlf
es manejar conversiones de terminaciones de línea de manera transparente. Y lo hace!Malas noticias : el valor debe configurarse manualmente.
Buenas noticias : solo debe hacerse UNA vez por instalación de git (también es posible la configuración por proyecto).
Cómo
autocrlf
funciona :Aquí
crlf
= marcador de fin de línea estilo win,lf
= estilo unix (y mac osx).(pre-osx
cr
no se ve afectado por ninguna de las tres opciones anteriores)¿Cuándo aparece esta advertencia (en Windows)
-
autocrlf
=true
si tiene estilo unixlf
en uno de sus archivos (= RARAMENTE),-
autocrlf
=input
si tiene estilo wincrlf
en uno de sus archivos (= casi SIEMPRE),-
autocrlf
=false
- ¡NUNCA!¿Qué significa esta advertencia?
La advertencia " LF será reemplazado por CRLF " dice que usted (tener
autocrlf
=true
) perderá su LF de estilo Unix después del ciclo de confirmación de compra (será reemplazado por CRLF de estilo Windows). Git no espera que uses LF de estilo unix en Windows.La advertencia " CRLF será reemplazado por LF " dice que usted (tener
autocrlf
=input
) perderá su CRLF de estilo Windows después de un ciclo de confirmación de compra (será reemplazado por LF de estilo Unix). No lo useinput
debajo de las ventanas.Otra forma más de mostrar cómo
autocrlf
funcionadónde x es CRLF (estilo Windows) o LF (estilo Unix) y las flechas representan
Como arreglar
El valor predeterminado para
core.autocrlf
se selecciona durante la instalación de git y se almacena en todo el sistema gitconfig (%ProgramFiles(x86)%\git\etc\gitconfig
). También hay (en cascada en el siguiente orden):- gitconfig "global" (por usuario) ubicado en
~/.gitconfig
, otro más- gitconfig "global" (por usuario) en
$XDG_CONFIG_HOME/git/config
o$HOME/.config/git/config
y- "local" (por repo)
.git/config
en el directorio de trabajo.Entonces, escribe
git config core.autocrlf
en el directorio de trabajo para verificar el valor utilizado actualmente y- agregar
autocrlf=false
a la solución # por sistema de gitconfig en todo el sistema-
git config --global core.autocrlf false
# solución por usuario-
git config --local core.autocrlf false
# por proyectoAdvertencias
: la
git config
configuración puede ser anulada por lagitattributes
configuración.-
crlf -> lf
conversión solo ocurre al agregar nuevos archivos, loscrlf
archivos que ya existen en el repositorio no se ven afectados.Moral (para Windows):
- use
core.autocrlf
=true
si planea usar este proyecto también en Unix (y no está dispuesto a configurar su editor / IDE para usar terminaciones de línea Unix),- use
core.autocrlf
=false
si planea usar este proyecto solo en Windows ( o ha configurado su editor / IDE para usar terminaciones de línea unix),- nunca use
core.autocrlf
= ainput
menos que tenga una buena razón para hacerlo ( p . ej. si está utilizando utilidades Unix en Windows o si tiene problemas con los archivos MAKE),PD: ¿Qué elegir al instalar git para Windows?
Si no va a utilizar ninguno de sus proyectos en Unix, no esté de acuerdo con la primera opción predeterminada. Elige el tercero ( Checkout as-is, commit as-is ). No verás este mensaje. Siempre.
PPS Mi preferencia personal es configurar el editor / IDE para usar finales de estilo Unix, y configurarlo
core.autocrlf
enfalse
.fuente
core.autocrlf
como entrada? Por lo que deduje de su respuesta, configurarlo como entrada asegura que el repositorio y el directorio de trabajo siempre tengan finales de línea de estilo unix. ¿Por qué nunca querrías eso en Windows?Git tiene tres modos de cómo trata las terminaciones de línea:
Puede configurar el modo para usar agregando un parámetro adicional de
true
ofalse
a la línea de comando anterior.Si
core.autocrlf
se establece en verdadero, eso significa que cada vez que agregue un archivo al repositorio de git que git piense que es un archivo de texto, convertirá todas las terminaciones de línea CRLF a solo LF antes de almacenarlo en la confirmación. Cuando ustedgit checkout
algo, todos los archivos de texto tendrán automáticamente sus terminaciones de línea LF convertidas en terminaciones CRLF. Esto permite el desarrollo de un proyecto a través de plataformas que usan diferentes estilos de final de línea sin que las confirmaciones sean muy ruidosas porque cada editor cambia el estilo de final de línea ya que el estilo de final de línea siempre es LF.El efecto secundario de esta conversión conveniente, y de esto se trata la advertencia que está viendo, es que si un archivo de texto que creó originalmente tenía terminaciones LF en lugar de CRLF, se almacenará con LF como de costumbre, pero cuando se verifica más tarde tendrá terminaciones CRLF. Para archivos de texto normales, esto generalmente está bien. La advertencia es un "para su información" en este caso, pero en caso de que git evalúe incorrectamente que un archivo binario sea un archivo de texto, es una advertencia importante porque git estaría corrompiendo su archivo binario.
Si
core.autocrlf
se establece en falso, nunca se realiza una conversión de final de línea, por lo que los archivos de texto se registran tal cual. Esto generalmente funciona bien, siempre y cuando todos sus desarrolladores estén en Linux o todos en Windows. Pero en mi experiencia todavía tiendo a obtener archivos de texto con terminaciones de línea mixtas que terminan causando problemas.Mi preferencia personal es dejar la configuración activada, como desarrollador de Windows.
Consulte http://kernel.org/pub/software/scm/git/docs/git-config.html para obtener información actualizada que incluye el valor de "entrada".
fuente
core.eol
configuración, tal vez en concierto con la.gitattributes
configuración. He estado tratando de descubrir las diferencias y las superposiciones a través de la experimentación, y es muy confuso.Si ya ha desprotegido el código, los archivos ya están indexados. Después de cambiar la configuración de git, diga ejecutando:
deberías actualizar los índices con
y reescribir el índice git con
https://help.github.com/articles/dealing-with-line-endings/#refreshing-a-repository-after-changing-line-endings
Nota: esto eliminará sus cambios locales, considere guardarlos antes de hacer esto.
fuente
git rm --cached -r .
? ¿Por quégit reset --hard
no es suficiente?git rm --cached -r .
Si lo hacegit reset --hard
después de cambiar lacore.autocrlf
configuración, no volverá a convertir las terminaciones de línea. Necesitas limpiar el índice git.fuente
autcrlf
defalse
las bateas sólo el tema a todos los usuarios de su proyecto.git config --global core.autocrlf false
en su lugar.Tanto unix2dos como dos2unix están disponibles en ventanas con gitbash. Puede usar el siguiente comando para realizar la conversión de UNIX (LF) -> DOS (CRLF). Por lo tanto, no recibirá la advertencia.
o
Pero no ejecute este comando en ningún archivo CRLF existente, entonces obtendrá nuevas líneas vacías cada segunda línea.
dos2unix -D filename
no funcionará con todos los sistemas operativos. Por favor, consulte este enlace para ver la compatibilidad.Si por alguna razón necesita forzar el comando, use
--force
. Si dice no válido, úsalo-f
.fuente
dos2unix -D
convertirá las terminaciones de línea de Windows en terminaciones de línea de Linux. ¿No es lo mismo que la conversión de DOS (CRLF) -> UNIX (LF)? Sin embargo,dos2unix -h
afirma que-D
realizará la conversión de UNIX (LF) -> DOS (CRLF). dos2unix Más información: gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unixCreo que la respuesta de @ Basiloungas es cercana pero desactualizada (al menos en Mac).
Abra el archivo ~ / .gitconfig y configúrelo
safecrlf
en falsoEso * hará que ignore el final de la línea char aparentemente (funcionó para mí, de todos modos).
fuente
safecrlf
(con una 'f')Un artículo de GitHub sobre terminaciones de línea se menciona comúnmente cuando se habla de este tema.
Mi experiencia personal con el uso de la
core.autocrlf
configuración de configuración a menudo recomendada fue muy variada.Estoy usando Windows con Cygwin, tratando con proyectos de Windows y UNIX en diferentes momentos. Incluso mis proyectos de Windows a veces usan
bash
scripts de shell, que requieren terminaciones de línea UNIX (LF).Usando la
core.autocrlf
configuración recomendada de GitHub para Windows, si reviso un proyecto UNIX (que funciona perfectamente en Cygwin, o tal vez estoy contribuyendo a un proyecto que uso en mi servidor Linux), los archivos de texto se extraen con Windows (CRLF ) terminaciones de línea, creando problemas.Básicamente, para un entorno mixto como el que tengo, establecer el global
core.autocrlf
en cualquiera de las opciones no funcionará bien en algunos casos. Esta opción podría establecerse en una configuración git local (repositorio), pero incluso eso no sería lo suficientemente bueno para un proyecto que contenga material relacionado con Windows y UNIX (por ejemplo, tengo un proyecto de Windows con algunosbash
scripts de utilidad).La mejor opción que he encontrado es crear archivos .gitattributes por repositorio . El artículo de GitHub lo menciona.
Ejemplo de ese artículo:
En uno de los repositorios de mi proyecto:
Es un poco más que configurar, pero hágalo una vez por proyecto, y cualquier colaborador en cualquier sistema operativo no debería tener problemas con los finales de línea cuando trabaje con este proyecto.
fuente
text=false eol=false
funcionaba de manera similar abinary
. ¿Eso suena bien? Puede ser útil indicar "Sé que estos son archivos de texto, pero no quiero que se normalicen"En vim abra el archivo (por ejemplo:)
:e YOURFILE
ENTER, luegofuente
vim
dejaría toda la línea terminada intacta.Yo tuve este problema también.
SVN no realiza ninguna conversión de final de línea, por lo que los archivos se confirman con terminaciones de línea CRLF intactas. Si luego usa git-svn para poner el proyecto en git, las terminaciones de CRLF persisten en el repositorio de git, que no es el estado en el que git espera encontrarse; el valor predeterminado es tener solo terminaciones de línea unix / linux (LF) registrado
Cuando luego revisa los archivos en Windows, la conversión de autocrlf deja los archivos intactos (ya que tienen las terminaciones correctas para la plataforma actual), sin embargo, el proceso que decide si hay una diferencia con los archivos registrados realiza la conversión inversa antes de comparar, lo que resulta en comparar lo que cree que es un LF en el archivo desprotegido con un CRLF inesperado en el repositorio.
Hasta donde puedo ver, sus opciones son:
Nota al pie: si elige la opción n. ° 2, mi experiencia es que algunas de las herramientas auxiliares (rebase, parche, etc.) no hacen frente a archivos CRLF y, tarde o temprano, terminará con archivos con una combinación de CRLF y LF (línea inconsistente) terminaciones). No conozco ninguna forma de obtener lo mejor de ambos.
fuente
rebase
no tiene ningún problema con CRLF. El único problema que conozco es que la herramienta de combinación de git estándar insertará sus marcadores de conflicto ("<<<<<<", ">>>>>>" etc.) solo con LF, por lo que un archivo con marcadores de conflicto tienen terminaciones de línea mixtas. Sin embargo, una vez que elimine los marcadores, todo estará bien.Eliminando lo siguiente del archivo ~ / .gitattributes
* text=auto
evitará que git verifique los finales de línea en primer lugar.
fuente
false
, si este no se elimina, establecer el autocrlf en falso no ayudará mucho, por lo que este me ayudó (pero por sí solo no es suficiente).text=
configuración.gitattributes
(que, si está presente, SERÁ un bloqueador). Entonces las otras respuestas están incompletas. Me estaba volviendo loco tratando de descubrir por qué mis archivos seguían apareciendo como "modificados", sin importar cuántas veces cambié mi configuraciónautocrlf
y misafecrlf
configuración, y desprotegido y borrado el caché de git y el restablecimiento completo.Debería leer:
Esta imagen debería explicar lo que significa.
fuente
http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/
Hacer esto en un commit o git separado aún podría ver archivos completos como modificados cuando realiza un solo cambio (dependiendo de si ha cambiado la opción de autocrlf)
Este realmente funciona. Git respetará las terminaciones de línea en proyectos de terminación de línea mixta y no le advertirá sobre ellas.
fuente
*.sh -crlf
todo el tiempo ...No sé mucho sobre git en Windows, pero ...
Me parece que git está convirtiendo el formato de retorno para que coincida con el de la plataforma en ejecución (Windows). CRLF es el formato de retorno predeterminado en Windows, mientras que LF es el formato de retorno predeterminado para la mayoría de los otros sistemas operativos.
Lo más probable es que el formato de retorno se ajuste correctamente cuando el código se mueva a otro sistema. También creo que git es lo suficientemente inteligente como para mantener intactos los archivos binarios en lugar de tratar de convertir LF a CRLF en, digamos, JPEG.
En resumen, probablemente no necesite preocuparse demasiado por esta conversión. Sin embargo, si va a archivar su proyecto como un tarball, los codificadores probablemente apreciarían tener terminadores de línea LF en lugar de CRLF. Dependiendo de cuánto le importe (y de no usar el Bloc de notas), es posible que desee configurar git para que use devoluciones LF si puede :)
Apéndice: CR es el código ASCII 13, LF es el código ASCII 10. Por lo tanto, CRLF es dos bytes, mientras que LF es uno.
fuente
Asegúrate de haber instalado el último git.
Hice lo anterior
git config core.autocrlf false
, cuando utilicé git (versión 2.7.1), pero no funcionó.Entonces funciona ahora cuando actualiza git (de 2.7.1 a 2.20.1).
fuente
fuente
git config --global core.autocrlf false
para evitar que Git establezca las terminaciones de líneaUnix
en una confirmación. Realice un seguimiento congit config core.autocrlf
para verificar que, de hecho, esté establecido en falso.La pregunta de OP está relacionada con Windows y no podría usar otros sin ir al directorio o incluso ejecutar el archivo en Notepad ++ ya que el administrador no funcionó. Así que tuve que seguir esta ruta:
fuente
Muchos editores de texto le permiten cambiar
LF
, consulte las instrucciones de Atom a continuación. Simple y explícito.Haga clic
CRLF
en la parte inferior derecha:Seleccione
LF
en el menú desplegable en la parte superior:fuente
En un indicador de shell GNU / Linux, los comandos dos2unix y unix2dos le permiten convertir / formatear fácilmente sus archivos provenientes de MS Windows
fuente
CRLF podría causar algún problema al usar su "código" en dos sistemas operativos diferentes (Linux y Windows). Mi script de Python fue escrito en el contenedor de Docker de Linux y luego fue empujado usando Windows git-bash. Me dio la advertencia de que LF será reemplazado por CRLF. No lo pensé mucho, pero cuando comencé el guión más tarde, decía
/usr/bin/env: 'python\r': No such file or directory
. Ahora que una\r
ramificación para ti. Windows usa "CR" - retorno de carro - encima de '\ n' como nuevo carácter de línea -\n\r
. Eso es algo que deberías tener en cuenta.fuente
La mayoría de las herramientas en Windows acepta solo LF en archivos de texto. Por ejemplo, puede controlar el comportamiento de Visual Studio en un archivo llamado '.editorconfig' con el siguiente contenido de ejemplo (parte):
¡Solo el Bloc de notas original de Windows no funciona con LF, pero hay algunas herramientas de editor simples más apropiadas disponibles!
Por lo tanto, también debe usar LF en archivos de texto en Windows. Este es mi mensaje, ¡muy recomendable! ¡No hay ninguna razón para usar CRLF en Windows!
(La misma discusión está usando \ in include path en C / ++, es una tontería, use #include <pathTo / myheader.h> con slash !, es el estándar C / ++ y todos los compiladores de microsoft lo admiten).
Por lo tanto, la configuración adecuada para git es
Mi mensaje: Olvídese de programas de pensamiento tan antiguos como dos2unix y unix2dos. Aclare en su equipo que LF es apropiado para usar bajo Windows.
fuente