--- 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 en LF
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:
- Agregar un archivo de texto para commit ( organizarlo ) es como copiar el archivo a otro lugar dentro del
.git/
subdirectorio con terminaciones de línea convertidas (dependiendo decore.autocrlf
valor en la configuración de su cliente). Todo esto se hace localmente.
- ajuste
core.autocrlf
es como proporcionar una respuesta a la pregunta (exactamente la misma pregunta en todos los sistemas operativos):
- "Debería git-client a. Convertir LF-a-CRLF al retirar (extraer) los cambios de repositorio desde el control remoto o b. Convertir CRLF-a-LF al agregar un archivo para confirmación? " Y las posibles respuestas (valores) son:
false:
" no hacer ninguno de lo anterior ",
input:
" hacer solo b "
true
: " hacer ayb "
- tenga en cuenta que NO hay " hacer solo un "
por suerte
- los valores predeterminados del cliente git (windows:,
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:
- Puede haber clientes GUI que no respeten el
core.autocrlf
valor git
- Puede haber personas que no usan un valor para respetar su estrategia de repositorio. Por ejemplo, usan
core.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:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
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:
- windows:
core.autocrlf=true
significa convertir líneas a CRLF al finalizar la compra y convertir líneas a LF al agregar archivos.
- Linux:
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 es false
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.
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
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:
- Asegúrese de que cada archivo no binario se confirme con LF en git repo (comportamiento predeterminado).
- Utilice este comando para asegurarse de que no hay archivos están comprometidos con CRLF:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Nota: en los clientes de Windows funciona sólo a través de git-bash
y en los clientes de Linux sólo si compilado utilizando --with-libpcre
en./configure
).
- Si encuentra alguno de estos archivos ejecutando el comando anterior, corríjalos. Esto implica (al menos en Linux):
- conjunto
core.autocrlf=input
( --- actualización 3 - )
- cambiar el archivo
- revertir el cambio (el archivo todavía se muestra como modificado)
- comprometerlo
- Use solo el mínimo
.gitattributes
- Indique a los usuarios que establezcan lo
core.autocrlf
descrito anteriormente en sus valores predeterminados.
- No cuente al 100% con la presencia de
.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:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
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.
.gitattributes
?