Tengo un repositorio git alojado en github. Muchos de los archivos se desarrollaron inicialmente en Windows, y no tuve demasiado cuidado con los finales de línea. Cuando realicé la confirmación inicial, tampoco tenía ninguna configuración de git para aplicar las terminaciones de línea correctas. El resultado es que tengo varios archivos con terminaciones de línea CRLF en mi repositorio github.
Ahora estoy desarrollando parcialmente en Linux, y me gustaría limpiar las terminaciones de línea. ¿Cómo puedo asegurarme de que los archivos se almacenan correctamente con LF en github y tener LF en mi copia de trabajo?
He configurado un .gitattributes
archivo que contiene text eol=LF
; ¿Es eso correcto? Con eso comprometido y presionado, ¿puedo simplemente rm
mi repositorio local y volver a clonar desde github para obtener el efecto deseado?
Respuestas:
Sin un poco de información sobre qué archivos hay en su repositorio (código fuente puro, imágenes, ejecutables, ...), es un poco difícil responder la pregunta :)
Además de esto, consideraré que está dispuesto a usar LF por defecto como terminaciones de línea en su directorio de trabajo porque está dispuesto a asegurarse de que los archivos de texto tengan terminaciones de línea LF en su repositorio .git si trabaja en Windows o Linux . De hecho, más vale prevenir que curar ...
Sin embargo, hay una mejor alternativa: Benefíciese de las terminaciones de línea LF en su directorio de trabajo de Linux, las terminaciones de línea CRLF en su directorio de trabajo de Windows Y las terminaciones de línea LF en su repositorio.
Como está trabajando parcialmente en Linux y Windows, asegúrese de que
core.eol
esté configuradonative
ycore.autocrlf
configurado comotrue
.Luego, reemplace el contenido de su
.gitattributes
archivo con lo siguienteEsto le permitirá a Git manejar la conversión automática de terminaciones de línea para usted, en confirmaciones y pagos. Los archivos binarios no se modificarán, los archivos detectados como archivos de texto verán las terminaciones de línea convertidas sobre la marcha.
Sin embargo, como conoce el contenido de su repositorio, puede echarle una mano a Git y ayudarlo a detectar archivos de texto de archivos binarios.
Siempre que trabaje en un proyecto de procesamiento de imágenes basado en C, reemplace el contenido de su
.gitattributes
archivo con lo siguienteEsto asegurará que los archivos cuya extensión sea c, h o txt se almacenen con terminaciones de línea LF en su repositorio y tengan terminaciones de línea nativas en el directorio de trabajo. Los archivos JPEG no serán tocados. Todos los demás se beneficiarán del mismo filtrado automático como se ve arriba.
Para obtener una comprensión más profunda de los detalles internos de todo esto, te sugiero que te sumerjas en esta muy buena publicación "Cuidado con el final de tu línea" de Tim Clem, un Githubber.
Como ejemplo del mundo real, también puede echar un vistazo a esta confirmación donde
.gitattributes
se demuestran esos cambios en un archivo.ACTUALIZAR la respuesta considerando el siguiente comentario
Tiene sentido. Gracias por la aclaración. En este contexto específico, el
.gitattributes
archivo por sí solo no será suficiente.Ejecute los siguientes comandos en su repositorio
Como su repositorio se comparte entre su entorno Linux y Windows, esto actualizará el archivo de configuración local para ambos entornos.
core.eol
se asegurará de que los archivos de texto tengan terminaciones de línea LF en los pagos.core.autocrlf
asegurará que el potencial CRLF en archivos de texto (resultante de una operación de copiar / pegar, por ejemplo) se convierta a LF en su repositorio.Opcionalmente, puede ayudar a Git a distinguir qué es un archivo de texto creando un
.gitattributes
archivo que contenga algo similar a lo siguiente:Si decidió crear un
.gitattributes
archivo, confírmelo .Por último, asegúrese de que se
git status
mencione "nada que confirmar (limpieza del directorio de trabajo)" , luego realice la siguiente operaciónEsto recreará sus archivos en su directorio de trabajo, teniendo en cuenta sus cambios de configuración y el
.gitattributes
archivo y reemplazando cualquier CRLF potencial pasado por alto en sus archivos de texto.Una vez hecho esto, cada archivo de texto en su directorio de trabajo TENDRÁ terminaciones de línea LF y
git status
aún debería considerar el workdir como limpio.fuente
vi
está menos contento con CRLF. ¿Solo quiero cambiarlo para quecore.autocrlf
seafalse
(oinput
)?git checkout-index --force --all
puede funcionar mejor. El segundo punto parece un poco fuera de tema con respecto a la pregunta original. ¿Qué tal hacer una pregunta dedicada?text
yeol=lf
lograr el mismo resultado que se describe en su respuesta a través decore.eol
ycore.autocrlf
?git checkout-index --force --all
no hace nada por mi Lo que funciona es la lista de comandos en las instrucciones de GitHub para tratar este problema.Comenzando con git 2.10 (publicado el 03/09/2016), no es necesario enumerar cada archivo de texto por separado. Git 2.10 arregló el comportamiento de text = auto junto con eol = lf . Fuente .
.gitattributes
archivo en la raíz de su repositorio git:Añadir y confirmarlo.
Luego, puede seguir los pasos y todos los archivos están normalizados ahora:
Fuente: Respuesta de kenorb .
fuente
Para forzar las terminaciones de línea LF para todos los archivos de texto, puede crear
.gitattributes
archivos en el nivel superior de su repositorio con las siguientes líneas (cambie según lo desee):lo que garantiza que todos los archivos que Git considera como archivos de texto tienen
LF
terminaciones de línea normalizadas ( ) en el repositorio (normalmente, lacore.eol
configuración controla cuál tiene por defecto).Según la nueva configuración de atributos, Git debería normalizar cualquier archivo de texto que contenga CRLF. Si esto no sucede automáticamente, puede actualizar un repositorio manualmente después de cambiar las terminaciones de línea, para que pueda volver a escanear y confirmar el directorio de trabajo siguiendo los siguientes pasos (dado un directorio de trabajo limpio):
o según los documentos de GitHub :
Ver también: publicación de @Charles Bailey .
Además, si desea excluir cualquier archivo para que no sea tratado como un texto, desarme su atributo de texto, p. Ej.
O márquelo explícitamente como binario:
Para ver un archivo de normalización git más avanzado, verifique
.gitattributes
en el núcleo de Drupal :Ver también:
fuente
text=auto
es engañoso. No se puede usartext=auto
yeol
juntos. La configuracióneol
desactiva la detección automática de archivos de texto. Es por eso que debe especificar todos esos tipos de archivos. Siauto
estaba habilitado, no necesitarías todo eso. 2. No necesitastext
yeol=lf
.eol=lf
establece efectivamentetext
.* text=auto eol=lf
el primerotext=auto
es anulado poreol=lf
. ¿Dónde encontraste esta función? Aquí está mi fuente: stackoverflow.com/questions/29435156/…* text=auto eol=lf
del ejemplo, ya que también se eliminó de Drupal. Considere eliminar los comentarios también.