251 votes

Windows git "warning : LF sera remplacé par CRLF", est-ce que cet avertissement est en queue de poisson ?

Env :

  • Windows 7
  • msysgit

Wheng I git commit il est dit :

warning: LF will be replaced by CRLF. 

Cette queue d'avertissement est-elle à l'envers ?
J'édite le fichier sous Windows, la fin de la ligne est CRLF comme cette photo :
enter image description here
Et git le change en LF pour le dépôt dans le dépôt.
Donc je pense que l'avertissement correct est :

warning: CRLF will be replaced by LF.

314voto

VonC Points 414372

avertissement : LF sera remplacé par CRLF.

Selon l'éditeur que vous utilisez, un fichier texte avec LF ne sera pas nécessairement enregistré avec CRLF : les éditeurs récents peuvent préserver style eol. Mais ce paramètre de configuration de git insiste pour changer ces...

Assurez-vous simplement que (comme Je recommande ici ) :

git config --global core.autocrlf false

De cette façon, vous évitez toute transformation automatique, et vous pouvez toujours les spécifier par le biais d'un fichier de type .gitattributes fichier y core.eol directives .


Windows git "LF sera remplacé par CRLF"

Note : le message d'avertissement a changé avec Git 2.37 (Q3 2022)

Cette queue d'avertissement est-elle à l'envers ?

Non : vous êtes sous Windows, et le git config page d'aide mentionne

Utilisez ce paramètre si vous voulez que CRLF dans votre répertoire de travail même si le référentiel n'a pas de terminaisons de lignes normalisées.

Comme décrit dans " git remplace LF par CRLF ", cela ne devrait se produire qu'au moment du paiement (pas d'engagement), avec core.autocrlf=true .

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

Comme mentionné dans XiaoPeng 's réponse cet avertissement est le même que :

avertissement : (Si vous le retirez ou si vous le clonez dans un autre dossier avec votre version actuelle de l core.autocrlf configuration,) LF sera remplacé par CRLF
Le fichier aura ses fins de lignes originales dans votre répertoire de travail (actuel).

Comme mentionné dans git-for-windows/git numéro 1242 :

Je pense toujours que ce message est confus, le message pourrait être étendu pour inclure une meilleure explication du problème, par exemple : "LF sera remplacé par CRLF en file.json après avoir supprimé le fichier et l'avoir vérifié à nouveau".

Remarque : dans Git 2.19 (septembre 2018), lorsque vous utilisez la fonction core.autocrlf , le faux "LF sera remplacé par CRLF" est maintenant supprimé. .


Comme quaylar à juste titre commentaires s'il y a une conversion sur l'engagement, c'est pour LF seulement.

Cet avertissement spécifique " LF will be replaced by CRLF "vient de convert.c#check_safe_crlf() :

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

Il est appelé par convert.c#crlf_to_git() lui-même appelé par convert.c#convert_to_git() lui-même appelé par convert.c#renormalize_buffer() .

Et cette dernière renormalize_buffer() n'est appelé que par merge-recursive.c#blob_unchanged() .

Donc je soupçonne que cette conversion se fait sur un git commit seulement si ce commit fait partie d'un processus de fusion.


Note : avec Git 2.17 (Q2 2018), un nettoyage de code ajoute quelques explications.

Voir commettre 8462ff4 (13 janvier 2018) par Torsten Bögershausen ( tboegi ) .
(fusionné par Junio C Hamano -- gitster -- sur commit 9bc89b1 , 13 février 2018)

convert_to_git() : safe_crlf/checksafe devient int conv_flags

Lors de l'appel convert_to_git() le checksafe a défini ce que doit se produire si la conversion EOL ( CRLF --> LF --> CRLF ) ne fait pas ne fait pas l'aller-retour proprement.
En outre, elle a également défini si les fins de ligne devaient être renormalisées ( CRLF --> LF ) ou conservés tels quels.

checksafe était un safe_crlf avec ces valeurs :

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Notez qu'une régression introduite dans 8462ff4 (" convert_to_git() : safe_crlf/checksafe devient int conv_flags ", 2018-01-13, Git 2.17.0) de retour dans le cycle Git 2.17 provoqué autocrlf réécrit pour produire un message d'avertissement malgré le réglage safecrlf=false .

Voir commettre 6cb0912 (04 juin 2018) par Anthony Sottile ( asottile ) .
(fusionné par Junio C Hamano -- gitster -- sur commettre 8063ff9 , 28 juin 2018)

50voto

Stijn de Witt Points 3515

OUI l'avertissement est à l'envers.

Et en fait, ça ne devrait même pas être un avertissement en premier lieu. Parce que tout ce que cet avertissement dit (mais à l'envers malheureusement) est que les caractères CRLF dans votre fichier avec des fins de lignes Windows seront remplacés par des LF lors de la validation. Ce qui signifie qu'il est normalisé aux mêmes fins de lignes que celles utilisées par *nix et MacOS.

Il ne se passe rien d'étrange, c'est exactement le comportement que l'on attend normalement.

Cet avertissement, sous sa forme actuelle, est l'une des deux choses suivantes :

  1. Un bug malheureux combiné à un message d'avertissement trop prudent, ou
  2. Une intrigue très intelligente pour vous faire vraiment réfléchissez bien...

;)

29voto

XiaoPeng Points 444

-Mise à jour le 9 juillet---

Supprimé "C'est correct et précis" comme commenté par @mgiuca

\======

NON . Il ne s'agit PAS de vos fichiers actuellement avec CRLF . Il s'agit plutôt de fichiers avec LF .

Il faut lire :

avertissement : ( Si vous l'extrayez et/ou le clonez dans un autre dossier avec votre configuration actuelle de core.autocrlf ,)LF sera remplacé par CRLF

Le fichier aura ses fins de lignes originales dans votre ( actuel ) du répertoire de travail.

Cette image devrait expliquer ce que cela signifie. enter image description here

18voto

mikew Points 375

Tout cela suppose core.autocrlf=true

Erreur d'origine :

avertissement : LF sera remplacé par CRLF
Le fichier aura ses fins de lignes originales dans votre répertoire de travail.

Ce que l'erreur DEVRAIT lire :

avertissement : LF sera remplacé par CRLF dans votre répertoire de travail
Le fichier aura ses fins de lignes LF originales. dans le dépôt git

Explication aquí :

L'effet secondaire de cette conversion pratique, et c'est l'objet de l'avertissement que vous voyez, est que si un fichier texte que vous avez créé avait à l'origine des terminaisons LF au lieu de CRLF, il sera stocké avec LF comme d'habitude, mais lorsqu'il sera extrait plus tard, il aura des terminaisons CRLF. Pour les fichiers texte normaux, cela est généralement très bien. L'avertissement est un "pour votre information" dans ce cas, mais au cas où git évaluerait incorrectement un fichier binaire comme étant un fichier texte, c'est un avertissement important car git corromprait alors votre fichier binaire.

Fondamentalement, un fichier local qui était précédemment LF aura maintenant CRLF localement.

13voto

fly bird Points 818

git config --global core.autocrlf false fonctionne bien pour les paramètres globaux.

Mais si vous utilisez Visual Studio, vous devrez peut-être aussi modifier .gitattributes pour certains types de projets ( par exemple, une application de bibliothèque de classe c# ) :

  • supprimer la ligne * text=auto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X