Me ha picado el problema de final de línea de Windows / Linux con git. Parece, a través de GitHub, MSysGit y otras fuentes, que la mejor solución es tener sus repositorios locales configurados para usar terminaciones de línea estilo Linux, pero configurados core.autocrlf
en true
. Desafortunadamente, no hice esto lo suficientemente temprano, así que ahora cada vez que hago cambios, las terminaciones de línea se descifran.
Pensé que había encontrado una respuesta aquí, pero no puedo hacer que funcione para mí. Mi conocimiento de la línea de comandos de Linux es limitado en el mejor de los casos, por lo que ni siquiera estoy seguro de lo que hace la línea "xargs fromdos" en su script. Sigo recibiendo mensajes sobre la ausencia de dicho archivo o directorio, y cuando logro señalarlo a un directorio existente, me dice que no tengo permisos.
He intentado esto con MSysGit en Windows y a través del terminal Mac OS X.
fuente
Respuestas:
La documentación de git para gitattributes ahora documenta otro enfoque para "arreglar" o normalizar todas las terminaciones de línea en su proyecto. Aquí está la esencia de esto:
Esto aprovecha un nuevo
--renormalize
indicador agregado en git v2.16.0, lanzado en enero de 2018. Para versiones anteriores de git, hay algunos pasos más:fuente
git reset
, por favor?git status
es ejecutargit diff --ignore-space-at-eol
solo para asegurarse de que los únicos cambios que está confirmando son los finales de línea.git reset
no detectará modificaciones y, por lo tanto, es inútil.--renormalize
bandera añadido en v2.16.0 git que fue lanzado en enero de 2018. El--renormalize
indicador consolida el proceso de re-procesamiento de los finales de línea para cada archivo de orugas en un solo comando:git add --renormalize .
.La forma más fácil de solucionar esto es hacer una confirmación que corrija todas las terminaciones de línea. Suponiendo que no tiene ningún archivo modificado, puede hacerlo de la siguiente manera.
fuente
Mi procedimiento para tratar con los finales de línea es el siguiente (batalla probada en muchos repositorios):
Al crear un nuevo repositorio:
.gitattributes
en el primer commit junto con otros archivos típicos como.gitignore
yREADME.md
Cuando se trata de un repositorio existente:
.gitattributes
consecuenciagit commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
(--no-verify
es omitir ganchos de precompromiso)alias fixCRLF="..."
En
.gitattributes
Declaro todos los archivos de texto explícitamente como LF EOL ya que generalmente las herramientas de Windows son compatibles con LF, mientras que las herramientas que no son de Windows no son compatibles con CRLF (incluso muchas herramientas de línea de comandos de nodejs asumen LF y, por lo tanto, pueden cambiar la EOL en sus archivos).Contenido de
.gitattributes
Mi
.gitattributes
generalmente se ve así:Para averiguar qué extensiones distintas son rastreadas por git en el repositorio actual, mira aquí
Problemas después de la normalización
Una vez hecho esto, hay una advertencia más común.
Digamos
master
que ya está actualizado y normalizado, y luego realiza el pagooutdated-branch
. Muy a menudo, justo después de revisar esa rama, git marca muchos archivos como modificados.La solución es hacer un commit falso (
git add -A . && git commit -m 'fake commit'
) y luegogit rebase master
. Después del rebase, la comisión falsa debería desaparecer.fuente
2.7.0.windows.1
, utilicé lo siguiente:git rm --cached -r . && git reset --hard && git add . && git commit -m "Normalize EOL" -n
Explicación:
git status --short
Esto muestra cada línea de la que git es y no es consciente. Los archivos que no están bajo el control de git están marcados al comienzo de la línea con un '?'. Los archivos que se modifican están marcados con una M.
grep "^ *M"
Esto filtra solo aquellos archivos que han sido modificados.
awk '{print $2}'
Esto muestra solo el nombre del archivo sin ningún marcador.
xargs fromdos
Esto toma los nombres de archivo del comando anterior y los ejecuta a través de la utilidad 'fromdos' para convertir los finales de línea.
fuente
dos2unix
lugar defromdos
.Así es como solucioné todas las terminaciones de línea en todo el historial usando
git filter-branch
. El^M
carácter necesita ser ingresado usandoCTRL-V
+CTRL-M
. Solíados2unix
convertir los archivos ya que esto omite automáticamente los archivos binarios.fuente
El "| xargs fromdos" lee de la entrada estándar (los archivos
find
encuentran) y lo usa como argumentos para el comandofromdos
, que convierte los finales de línea. (¿Fromdos es estándar en esos entornos? Estoy acostumbrado a dos2unix). Tenga en cuenta que puede evitar el uso de xargs (especialmente útil si tiene suficientes archivos para que la lista de argumentos sea demasiado larga para xargs):o
No estoy totalmente seguro de sus mensajes de error. Probé con éxito este método. ¿Qué programa está produciendo cada uno? ¿Para qué archivos / directorios no tiene permisos? Sin embargo, aquí hay una puñalada para adivinar cuál podría ser:
Una manera fácil de obtener un error de "archivo no encontrado" para el script es usando una ruta relativa: use una absoluta. Del mismo modo, podría obtener un error de permisos si no ha ejecutado su script (chmod + x).
¡Agregue comentarios y trataré de ayudarlo a resolverlo!
fuente
está bien ... bajo cygwin no tenemos fromdos fácilmente disponibles, y ese subpaso awk explota en tu cara si tienes espacios en las rutas a los archivos modificados (que teníamos), así que tuve que hacer eso de manera algo diferente:
felicitaciones a @lloyd por la mayor parte de esta solución
fuente
Siga estos pasos si ninguna de las otras respuestas funciona para usted:
git config --global core.autocrlf true
; si estás en Unix, hazgit config core.autocrlf input
git rm --cached -r .
.gitattributes
git add -A
git reset --hard
Entonces su local debe estar limpio ahora.
fuente
.gitattributes
archivo es la solución al problema de terminación de línea?