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.autocrlfen 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
--renormalizeindicador 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 statuses ejecutargit diff --ignore-space-at-eolsolo para asegurarse de que los únicos cambios que está confirmando son los finales de línea.git resetno detectará modificaciones y, por lo tanto, es inútil.--renormalizebandera añadido en v2.16.0 git que fue lanzado en enero de 2018. El--renormalizeindicador 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:
.gitattributesen el primer commit junto con otros archivos típicos como.gitignoreyREADME.mdCuando se trata de un repositorio existente:
.gitattributesconsecuenciagit commit -a -m "Modified gitattributes"git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"-n(--no-verifyes omitir ganchos de precompromiso)alias fixCRLF="..."En
.gitattributesDeclaro 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
.gitattributesMi
.gitattributesgeneralmente 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
masterque 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" -nExplicación:
git status --shortEsto 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 fromdosEsto 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
dos2unixlugar defromdos.Así es como solucioné todas las terminaciones de línea en todo el historial usando
git filter-branch. El^Mcarácter necesita ser ingresado usandoCTRL-V+CTRL-M. Solíados2unixconvertir los archivos ya que esto omite automáticamente los archivos binarios.fuente
El "| xargs fromdos" lee de la entrada estándar (los archivos
findencuentran) 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 inputgit rm --cached -r ..gitattributesgit add -Agit reset --hardEntonces su local debe estar limpio ahora.
fuente
.gitattributesarchivo es la solución al problema de terminación de línea?