¡Casi cuatro años después de hacer esta pregunta, finalmente encontré una respuesta que me satisface por completo !
Vea los detalles en github: guía de ayuda para
tratar con terminaciones de línea .
Git le permite establecer las propiedades de final de línea para un repositorio directamente usando el atributo de texto en el
.gitattributes
archivo. Este archivo se confirma en el repositorio y anula la core.autocrlf
configuración, lo que le permite garantizar un comportamiento coherente para todos los usuarios, independientemente de su configuración de git.
Y por lo tanto
La ventaja de esto es que su configuración de final de línea ahora viaja con su repositorio y no necesita preocuparse por si los colaboradores tienen o no la configuración global adecuada.
Aquí hay un ejemplo de un .gitattributes
archivo
# Auto detect text files and perform LF normalization
* text=auto
*.cs text diff=csharp
*.java text diff=java
*.html text diff=html
*.css text
*.js text
*.sql text
*.csproj text merge=union
*.sln text merge=union eol=crlf
*.docx diff=astextplain
*.DOCX diff=astextplain
# absolute paths are ok, as are globs
/**/postinst* text eol=lf
# paths that don't start with / are treated relative to the .gitattributes folder
relative/path/*.txt text eol=lf
Hay una colección conveniente de archivos .gitattributes listos para usar para los lenguajes de programación más populares. Es útil para comenzar.
Una vez que haya creado o ajustado su .gitattributes
, debe realizar una re-normalización de terminaciones de línea de una vez por todas .
Tenga en cuenta que la aplicación de escritorio GitHub puede sugerir y crear un .gitattributes
archivo después de abrir el repositorio Git de su proyecto en la aplicación. Para intentarlo, haga clic en el ícono de ajustes (en la esquina superior derecha)> Configuración del repositorio ...> Terminaciones de línea y atributos. Se le pedirá que agregue lo recomendado .gitattributes
y, si está de acuerdo, la aplicación también realizará una normalización de todos los archivos en su repositorio.
Finalmente, el artículo Mind the End of Your Line proporciona más antecedentes y explica cómo Git ha evolucionado en los asuntos en cuestión. Considero que esto requiere lectura .
Probablemente haya usuarios en su equipo que usen EGit o JGit (herramientas como Eclipse y TeamCity los usan) para confirmar sus cambios. Entonces no tienes suerte, como @gatinueta explicó en los comentarios de esta respuesta:
Esta configuración no lo satisfará por completo si tiene personas que trabajan con Egit o JGit en su equipo, ya que esas herramientas simplemente ignorarán los atributos .gitattributes y contestarán felizmente los archivos CRLF https://bugs.eclipse.org/bugs/show_bug.cgi? id = 342372
Un truco podría ser hacer que confirmen sus cambios en otro cliente, dice SourceTree . Nuestro equipo en aquel entonces prefirió esa herramienta al EGit de Eclipse para muchos casos de uso.
¿Quién dijo que el software es fácil? : - /
.gitattributes
?.gitattributes
sugiere GitHub para Windows para su proyecto? Instalé GitHub para Windows, comencé la versión GUI y no pude encontrar ninguna opción relacionada con.gitattributes
sugerencias.core.autocrlf = false
: prefiero LF en todas partes, pero algunas de las herramientas de Windows como Visual Studio insisten en las terminaciones de CRLF en ciertos archivos (e incluso mezclarlos en algunos ...); no munging terminaciones de línea es la opción más segura. Si sabe lo que está haciendo, probablemente usaríacore.autocrlf = input
y haría excepciones para proyectos en Windows que sabe que son sensibles a los finales de línea. Como otros señalan, cada editor de texto decente admite terminaciones LF ahora. De hecho, creocore.autocrlf = true
que probablemente pueda causar más problemas de los que previene.No convierta terminaciones de línea. No es trabajo del VCS interpretar datos, solo almacenarlos y versionarlos. Todos los editores de texto modernos pueden leer ambos tipos de terminaciones de línea de todos modos.
fuente
Casi siempre quieres a
autocrlf=input
menos que realmente sepas lo que estás haciendo.Algún contexto adicional a continuación:
El párrafo anterior se extrajo originalmente de un hilo en gmane.org, pero desde entonces ha caído.
fuente
core.autocrlf=input
Es la respuesta canónica. Para la mayoría de los casos de uso,core.autocrlf=true
ycore.autocrlf=false
son demasiado celosos (... en formas opuestas pero igualmente terribles, por supuesto) y, por lo tanto, intrínsecamente destructivos. "Git para Windows" realmente debería haberse incluido con "Finalizar compra tal cual, confirmar terminaciones de línea estilo Unix" (es decir,core.autocrlf=input
) como su estrategia predeterminada de nueva línea. No lo hizo. Así que aquí estamos aquí, en el maldito 2015 , aún debatiendo sin cesar esto.Dos estrategias alternativas para ser coherente con los finales de línea en entornos mixtos (Microsoft + Linux + Mac):
A. Configuración global para todos los repositorios
1) Convertir todo a un formato
2) Establecer
core.autocrlf
deinput
Linux / UNIX otrue
en MS Windows (repositorio o global)3) [Opcional] establecido
core.safecrlf
entrue
(para detener) owarn
(para cantar :) para agregar protección adicional al comparar si la transformación de nueva línea invertida daría como resultado el mismo archivoB. O según la configuración del repositorio
1) Convertir todo a un formato
2) agregar
.gitattributes
archivo a tu repositorioNo se preocupe por sus archivos binarios: Git debería ser lo suficientemente inteligente al respecto.
Más información sobre las variables safecrlf / autocrlf
fuente
dos2unix
es una herramienta de línea de comandos que dependiendo del sistema puede que tenga que instalar adicionalmentedos2unix
: existe el riesgo de corrupción.git/index
y no es necesario que lo apliquemos a todos los archivos. Es mejor usar algo comofind ./ -name "*.html"
y especificar a qué archivos desea aplicarlo.find
líneas, tenga en cuenta: eldos2unix
que viene enviado con Git para Windows tiene un comportamiento peculiar (IMO idiota y peligroso), sin argumentos: en lugar de cambiar a UNIX, alterna el formato de nueva línea (DOS <-> UNIX )Intente establecer la
core.autocrlf
opción de configuración entrue
. También eche un vistazo a lacore.safecrlf
opción.En realidad, parece
core.safecrlf
que ya podría estar configurado en su repositorio, porque (el énfasis es mío):Si este es el caso, es posible que desee verificar que su editor de texto esté configurado para usar terminaciones de línea consistentemente. Es probable que tenga problemas si un archivo de texto contiene una mezcla de terminaciones de línea LF y CRLF.
Finalmente, creo que la recomendación de simplemente "usar lo que se te da" y usar líneas terminadas LF en Windows causará más problemas de los que resuelve. Git tiene las opciones anteriores para tratar de manejar las terminaciones de línea de una manera sensata, por lo que tiene sentido usarlas.
fuente
El uso
core.autocrlf=false
detuvo la marca de todos los archivos como actualizados tan pronto como los revisé en mi Visual Studio 2010 proyecto de . Los otros dos miembros del equipo de desarrollo también están utilizando sistemas Windows, por lo que no entró en juego un entorno mixto, sin embargo, la configuración predeterminada que vino con el repositorio siempre marcó todos los archivos como actualizados inmediatamente después de la clonación.Supongo que la conclusión es encontrar qué configuración de CRLF funciona para su entorno. Especialmente porque en muchos otros repositorios en nuestra configuración de cajas de Linux
autocrlf = true
produce mejores resultados.Más de 20 años después y todavía estamos lidiando con disparidades de final de línea entre sistemas operativos ... triste.
fuente
Estas son las dos opciones para usuarios de Windows y Visual Studio que comparten código con usuarios de Mac o Linux . Para una explicación extendida, lea el manual de gitattributes .
* texto = auto
En el
.gitattributes
archivo de su repositorio agregue:Esto normalizará todos los archivos con
LF
terminaciones de línea en el repositorio.Y dependiendo de su sistema operativo (
core.eol
configuración), los archivos en el árbol de trabajo se normalizaránLF
para sistemas basados en Unix oCRLF
para sistemas Windows.Esta es la configuración que utilizan los repositorios de Microsoft .NET .
Ejemplo:
Se normalizará en el repositorio siempre como:
Al finalizar la compra, el árbol de trabajo en Windows se convertirá a:
Al finalizar la compra, el árbol de trabajo en Mac se dejará como:
core.autocrlf = true
Si
text
no se especifica en el.gitattributes
archivo, Git usa lacore.autocrlf
variable de configuración para determinar si el archivo debe convertirse.Para los usuarios de Windows,
git config --global core.autocrlf true
es una excelente opción porque:LF
finales de línea solo cuando se agregan al repositorio. Si hay archivos no normalizados en el repositorio, esta configuración no los tocará.CRLF
finales de línea en el directorio de trabajo.El problema con este enfoque es que:
autocrlf = input
, verá un montón de archivos conLF
terminaciones de línea. No es un peligro para el resto del equipo, porque sus compromisos aún se normalizarán con losLF
finales de línea.core.autocrlf = false
, verá un montón de archivos conLF
terminaciones de línea y puede introducir archivos conCRLF
terminaciones de línea en el repositorio.autocrlf = input
y pueden obtener archivos conCRLF
terminaciones de archivo, probablemente de usuarios de Windows concore.autocrlf = false
.fuente
git config --global core.autocrl true
. ¿Quiere decirgit config --global core.autocrlf true
.--- ACTUALIZACIÓN 3 --- (no entra en conflicto con ACTUALIZACIÓN 2)
Teniendo en cuenta el caso en que los usuarios de Windows prefieren trabajar
CRLF
y los usuarios de Linux / Mac prefieren trabajar enLF
archivos de texto. Proporcionando la respuesta desde la perspectiva de un mantenedor de repositorio :Para mí, la mejor estrategia (menos problemas para resolver) es: mantener todos los archivos de texto con el
LF
repositorio de git interno, incluso si está trabajando en un proyecto solo para Windows. Luego, dé a los clientes la libertad de trabajar en el estilo de final de línea de su preferencia , siempre que elijan uncore.autocrlf
valor de propiedad que respete su estrategia (LF en el repositorio) mientras preparan los archivos para la confirmación.La estadificación es lo que muchas personas confunden cuando intentan comprender cómo las estrategias de nueva línea funcionan las . Es esencial comprender los siguientes puntos antes de elegir el valor correcto para la
core.autocrlf
propiedad:.git/
subdirectorio con terminaciones de línea convertidas (dependiendo decore.autocrlf
valor en la configuración de su cliente). Todo esto se hace localmente.core.autocrlf
es como proporcionar una respuesta a la pregunta (exactamente la misma pregunta en todos los sistemas operativos):false:
" no hacer ninguno de lo anterior ",input:
" hacer solo b "true
: " hacer ayb "por suerte
core.autocrlf: true
linux / mac:)core.autocrlf: false
serán compatibles con la estrategia LF-only-repo .Significado : los clientes de Windows convertirán de forma predeterminada a CRLF al retirar el repositorio y a LF al agregar para confirmar. Y los clientes de Linux por defecto no harán ninguna conversión. Esto teóricamente mantiene su repositorio solo para lf.
Desafortunadamente:
core.autocrlf
valor gitcore.autocrlf=false
y agregan un archivo con CRLF para commit.Para detectar los archivos de texto ASAP no-lf confirmados por los clientes anteriores , puede seguir lo que se describe en --- actualización 2 ---: (
git grep -I --files-with-matches --perl-regexp '\r' HEAD
, en un cliente compilado usando:--with-libpcre
flag)Y aquí está la trampa: . Yo, como mantenedor de repositorios, mantengo un
git.autocrlf=input
archivo para poder reparar cualquier archivo comprometido incorrectamente simplemente agregándolos nuevamente para confirmar. Y proporciono un texto de confirmación: "Arreglando archivos incorrectamente comprometidos".Por lo que
.gitattributes
se refiere. No cuento con eso, porque hay más clientes ui que no lo entienden. Solo lo uso para proporcionar sugerencias para archivos de texto y binarios, y tal vez marque algunos archivos excepcionales que en todas partes deben mantener los mismos finales de línea:Pregunta: ¿Pero por qué nos interesa en absoluto la estrategia de manejo de nueva línea?
Respuesta: Para evitar una confirmación de cambio de una sola letra, aparece como un cambio de 5000 líneas , solo porque el cliente que realizó el cambio convirtió automáticamente el archivo completo de crlf a lf (o lo contrario) antes de agregarlo para la confirmación. Esto puede ser bastante doloroso cuando hay una resolución de conflicto involucrada. O podría en algunos casos ser la causa de conflictos irrazonables.
--- ACTUALIZACIÓN 2 ---
Los defectos de git client funcionarán en la mayoría de los casos. Incluso si solo tiene clientes de Windows, clientes de Linux o ambos. Estos son:
core.autocrlf=true
significa convertir líneas a CRLF al finalizar la compra y convertir líneas a LF al agregar archivos.core.autocrlf=input
significa no convertir líneas al finalizar la compra (no es necesario, ya que se espera que los archivos se confirmen con LF) y convertir líneas a LF (si es necesario) al agregar archivos. ( - update3 - : Parece que esto esfalse
por defecto, pero nuevamente está bien)La propiedad se puede establecer en diferentes ámbitos. Sugeriría establecer explícitamente en el
--global
alcance, para evitar algunos problemas de IDE descritos al final.También desaconsejaría usarlo en Windows
git config --global core.autocrlf false
(en caso de que solo tenga clientes de Windows) en contraste con lo que se propone para la documentación de git . Establecer en falso confirmará los archivos con CRLF en el repositorio. Pero realmente no hay razón. Nunca se sabe si tendrá que compartir el proyecto con los usuarios de Linux. Además, es un paso adicional para cada cliente que se une al proyecto en lugar de usar valores predeterminados.Ahora, para algunos casos especiales de archivos (p
*.bat
*.sh
. Ej. ) Que desea que se desprotejan con LF o con CRLF, puede usar.gitattributes
Para resumir, la mejor práctica es:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Nota: en los clientes de Windows funciona sólo a través degit-bash
y en los clientes de Linux sólo si compilado utilizando--with-libpcre
en./configure
).core.autocrlf=input
( --- actualización 3 - ).gitattributes
core.autocrlf
descrito anteriormente en sus valores predeterminados..gitattributes
. Los git-clients de IDEs pueden ignorarlos o tratarlos de manera diferente.Como se dijo, algunas cosas se pueden agregar en los atributos de git:
Creo que algunas otras opciones seguras para en
.gitattributes
lugar de utilizar la detección automática de archivos binarios:-text
(por ejemplo, para*.zip
o*.jpg
archivos: no se tratará como texto. Por lo tanto, no se intentarán conversiones de final de línea. La diferencia podría ser posible a través de programas de conversión)text !eol
(por ejemplo*.java
, para*.html
: tratado como texto, pero la preferencia de estilo de eol no está establecida. Por lo tanto, se usa la configuración del cliente)-text -diff -merge
(por ejemplo, para*.hugefile
: No se trata como texto. No es posible la diferencia / fusión)--- ACTUALIZACIÓN ANTERIOR ---
Un ejemplo doloroso de un cliente que confirmará los archivos incorrectamente:
netbeans 8.2 (en Windows), confirmará erróneamente todos los archivos de texto con CRLF, a menos que lo haya establecido explícitamente
core.autocrlf
como global . Esto contradice el comportamiento estándar del cliente git y causa muchos problemas más tarde, al actualizar / fusionar. Esto es lo que hace que algunos archivos parezcan diferentes (aunque no lo son) incluso cuando revierte .El mismo comportamiento en netbeans ocurre incluso si ha agregado correctamente
.gitattributes
a su proyecto.El uso del siguiente comando después de una confirmación, al menos lo ayudará a detectar temprano si su repositorio git tiene problemas de finalización de línea:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
He pasado horas para encontrar el mejor uso posible.gitattributes
, para finalmente darme cuenta, que no puedo contar con eso.Desafortunadamente, mientras existan editores basados en JGit (que no se pueden manejar
.gitattributes
correctamente), la solución segura es forzar LF en todas partes, incluso a nivel de editor.Use los siguientes
anti-CRLF
desinfectantes.Clientes Windows / Linux:
core.autocrlf=input
comprometido
.gitattributes
:* text=auto eol=lf
comprometido
.editorconfig
( http://editorconfig.org/ ) que es un tipo de formato estandarizado, combinado con complementos de editor:https://github.com/welovecoding/editorconfig-netbeans/fuente
.gitattributes
línea, tiene consecuencias involuntarias en Git <2.10, consulte stackoverflow.com/a/29508751/2261442git config --global core.autocrlf false
y recomiendan tratar con EOL.gitattributes
solo en las directivas.Esta es solo una solución alternativa :
En casos normales, use las soluciones que se envían con git. Estos funcionan muy bien en la mayoría de los casos. Forzar a LF si comparte el desarrollo en sistemas basados en Windows y Unix configurando .gitattributes .
En mi caso, había> 10 programadores desarrollando un proyecto en Windows. Este proyecto se registró con CRLF y no había opción de forzar a LF.
Algunas configuraciones fueron escritas internamente en mi máquina sin ninguna influencia en el formato LF; así, algunos archivos se cambiaron globalmente a LF en cada cambio de archivo pequeño.
Mi solución:
Máquinas Windows: Deje todo como está. No le importa nada, ya que usted es un desarrollador predeterminado de Windows 'Lone Wolf' y tiene que manejar así: "No hay otro sistema en el mundo, ¿verdad?"
Máquinas Unix
Agregue las siguientes líneas a la
[alias]
sección de una configuración . Este comando enumera todos los archivos modificados (es decir, modificados / nuevos):Convierta todos esos archivos modificados en formato DOS:
Opcionalmente ...
Crea un gancho git para esta acción para automatizar este proceso
Use params e inclúyalo y modifique la
grep
función para que coincida solo con nombres de archivos particulares, por ejemplo:Siéntase libre de hacerlo aún más conveniente utilizando un atajo adicional:
... y dispara las cosas convertidas escribiendo
fuente