Sur une machine Windows, j'ai ajouté quelques fichiers en utilisant git add
. J'ai reçu des avertissements disant :
LF sera remplacé par CRLF
Quelles sont les conséquences de cette conversion ?
Sur une machine Windows, j'ai ajouté quelques fichiers en utilisant git add
. J'ai reçu des avertissements disant :
LF sera remplacé par CRLF
Quelles sont les conséquences de cette conversion ?
Ces messages sont dus à une valeur par défaut incorrecte de core.autocrlf
sur Windows.
Le concept de autocrlf
est de gérer les conversions de fins de ligne de manière transparente. Et ça marche!
Mauvaise nouvelle : la valeur doit être configurée manuellement.
Bonne nouvelle : cela ne doit être fait qu'une seule fois par installation Git (la configuration par projet est également possible).
Comment autocrlf
fonctionne:
core.autocrlf=true: core.autocrlf=input: core.autocrlf=false:
dépôt dépôt dépôt
^ V ^ V ^ V
/ \ / \ / \
crlf->lf lf->crlf crlf->lf \ / \
/ \ / \ / \
Ici crlf
= marqueur de fin de ligne de style win, lf
= de style unix (également utilisé sur Mac depuis Mac OS X).
(pre-osx cr
n'est pas affecté pour aucune des trois options ci-dessus.)
Quand ce message d'avertissement apparaît-il (sous Windows)?
- autocrlf
= true
si vous avez des lf
de style unix dans l'un de vos fichiers (= RAREMENT),
- autocrlf
= input
si vous avez des crlf
de style win dans l'un de vos fichiers (= presque TOUJOURS),
- autocrlf
= false
- JAMAIS!
Que signifie ce message d'avertissement?
Le avertissement "LF sera remplacé par CRLF" indique que vous (ayant autocrlf
= true
) perdrez votre LF de style unix après un cycle de validation-extraction (il sera remplacé par CRLF de style windows). Git ne s'attend pas à ce que vous utilisiez LF de style unix sous Windows.
Le avertissement "CRLF sera remplacé par LF" indique que vous (ayant autocrlf
= input
) perdrez votre CRLF de style windows après un cycle de validation-extraction (il sera remplacé par LF de style unix). N'utilisez pas input
sous Windows.
Encore une manière de montrer comment autocrlf
fonctionne
1) true: x -> LF -> CRLF
2) input: x -> LF -> LF
3) false: x -> x -> x
où x est soit CRLF (de style windows) ou LF (de style unix) et les flèches représentent
fichier à valider -> dépôt -> fichier extrait
Comment corriger
La valeur par défaut de core.autocrlf
est sélectionnée lors de l'installation de Git et stockée dans le gitconfig système (%ProgramFiles(x86)%\git\etc\gitconfig
sur Windows, /etc/gitconfig
sur Linux). Il existe également (cascadant dans l'ordre suivant) :
- "global" (par utilisateur) gitconfig situé à ~/.gitconfig
, un autre
- "global" (par utilisateur) gitconfig à $XDG_CONFIG_HOME/git/config
ou $HOME/.config/git/config
et
- "local" (par projet) gitconfig à .git/config
dans le répertoire de travail.
Ainsi, écrivez git config core.autocrlf
dans le répertoire de travail pour vérifier la valeur actuellement utilisée et
- git config --system core.autocrlf false
# solution par système
- git config --global core.autocrlf false
# solution par utilisateur
- git config --local core.autocrlf false
# solution par projet
Avertissements
- Les paramètres de git config
peuvent être remplacés par les paramètres de gitattributes
.
- La conversion crlf -> lf
n'a lieu que lors de l'ajout de nouveaux fichiers, les fichiers crlf déjà existants dans le dépôt ne sont pas affectés.
Morale (pour Windows) :
- utilisez core.autocrlf
= true
si vous prévoyez d'utiliser ce projet sous Unix également (et que vous ne souhaitez pas configurer votre éditeur/IDE pour utiliser des fins de ligne unix),
- utilisez core.autocrlf
= false
si vous prévoyez d'utiliser ce projet sous Windows uniquement (ou si vous avez configuré votre éditeur/IDE pour utiliser des fins de ligne unix),
- ne utilisez jamais core.autocrlf
= input
à moins d'avoir une bonne raison (par exemple si vous utilisez des utilitaires unix sous Windows ou si vous rencontrez des problèmes de makefiles),
PS Que choisir lors de l'installation de Git pour Windows?
Si vous n'allez pas utiliser vos projets sous Unix, ne acceptez pas la première option par défaut. Choisissez la troisième option (Valider tel quel, extraire tel quel). Vous ne verrez plus ce message. Jamais.
PPS : Ma préférence personnelle est de configurer l'éditeur/IDE pour utiliser des fins de ligne de style unix et de définir core.autocrlf
sur false
.
Mise à jour (2022)
Depuis 2018, git peut --renormalize le dépôt en fixant les fins de ligne existantes comme requis.
Désolé, j'espère que mon commentaire n'a pas été pris comme une critique de votre réponse. Par "aller jusqu'ici", je veux dire, avant de trouver cette réponse.
Git a trois modes de traitement des fins de ligne :
# Cette commande affichera "true" ou "false" ou "input"
git config core.autocrlf
Vous pouvez définir le mode à utiliser en ajoutant un paramètre supplémentaire de true
ou false
à la ligne de commande ci-dessus.
Si core.autocrlf
est défini sur true, cela signifie qu'à chaque fois que vous ajoutez un fichier au dépôt Git que Git considère comme un fichier texte, il convertira toutes les fins de ligne CRLF en LF avant de le stocker dans le commit. Chaque fois que vous faites un git checkout
, tous les fichiers texte auront automatiquement leurs fins de ligne LF converties en fins de ligne CRLF. Cela permet le développement d'un projet sur des plateformes utilisant différents styles de fins de ligne sans que les commits soient très bruyants, car chaque éditeur change le style de fin de ligne pour que le style de fin de ligne soit toujours de manière cohérente LF.
L'effet secondaire de cette conversion pratique, et c'est de quoi parle l'avertissement que vous voyez, c'est que si un fichier texte que vous avez écrit avait à l'origine des fins de ligne LF au lieu de CRLF, il sera stocké avec LF comme d'habitude, mais lorsqu'il est vérifié ultérieurement, il aura des fins de ligne CRLF. Pour les fichiers texte normaux, cela est généralement acceptable. L'avertissement est là pour votre information dans ce cas, mais si Git évalue incorrectement un fichier binaire comme étant un fichier texte, c'est un avertissement important, car Git serait alors en train de corrompre votre fichier binaire.
Si core.autocrlf
est défini sur false, aucune conversion de fin de ligne n'est jamais effectuée, donc les fichiers texte sont enregistrés tels quels. Cela fonctionne généralement bien, tant que tous vos développeurs sont soit sur Linux, soit tous sur Windows. Mais dans mon expérience, j'ai tendance à obtenir des fichiers texte avec des fins de ligne mixtes qui finissent par causer des problèmes.
Ma préférence personnelle est de laisser le paramètre activé, en tant que développeur Windows.
Voir git-config pour des informations mises à jour incluant la valeur "input".
Comme dit ici (stackoverflow.com/questions/1249932/…), je respectueusement en désaccord et laisserais ce réglage à OFF (et utiliser Notepad++ ou tout autre éditeur capable de gérer -- et laisser tel quel -- tout caractère de fin de ligne qu'il trouve)
J'aime cette réponse et préfère laisser autocrlf défini sur true. En alternative, y a-t-il un moyen de tuer les messages d'avertissement automatiquement?
Il serait utile de compléter cette réponse bien écrite avec une comparaison des paramètres core.eol
, peut-être en parallèle avec la configuration .gitattributes
. J'ai essayé de comprendre les différences et les chevauchements par expérimentation, et c'est très déroutant.
Je ne comprends pas comment cela peut être utile. La moitié des gens nécessitent autocrlf vrai pour que cela fonctionne, l'autre moitié a besoin qu'il soit faux/input. Donc quoi, sont-ils censés jeter aléatoirement ces réponses ponctuelles contre le mur de leur console jusqu'à ce que quelque chose colle et fonctionne un peu? Ce n'est pas productif.
Je reçois une erreur "fatal: not in a git directory". J'ai essayé de cd vers C:\Program Files\Git et C:\Program Files\Git\bin
À la fois unix2dos et dos2unix sont disponibles sur Windows avec Git Bash. Vous pouvez utiliser la commande suivante pour effectuer la conversion UNIX (LF) → DOS (CRLF). Vous ne recevrez donc pas d'avertissement.
unix2dos filename
ou
dos2unix -D filename
Cependant, ne lancez pas cette commande sur un fichier CRLF existant, car vous obtiendrez alors des sauts de ligne vides toutes les deux lignes.
dos2unix -D filename
ne fonctionnera pas avec tous les systèmes d'exploitation. Veuillez vérifier ce lien pour la compatibilité.
Si pour une raison quelconque vous avez besoin de forcer la commande, utilisez --force
. Si cela indique une erreur, utilisez -f
.
@Rifat Je suis confuse. Votre commentaire dit que dos2unix -D
va convertir les sauts de ligne de Windows en sauts de ligne de Linux. Est-ce que c'est la même chose que la conversion DOS(CRLF) -> UNIX(LF). Cependant dos2unix -h
indique que -D
va effectuer la conversion UNIX(LF) -> DOS(CRLF). dos2unix Plus d'informations: gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unix
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.
20 votes
@apphacker parce que normaliser les sauts de ligne est moins ennuyeux que de devoir les changer manuellement lorsque vous comparez deux fichiers. (Et bien sûr, si vous n'êtes pas d'accord, vous pouvez désactiver la fonction core.autocrlf).
3 votes
Pourquoi les sauts de ligne seraient-ils différents à moins que toute la ligne n'ait été touchée
4 votes
Je touche souvent beaucoup de lignes, car j'expérimente avec différentes idées, ajoutant des déclarations de suivi pour voir comment elles fonctionnent, etc. Ensuite, je pourrais vouloir ne commettre un changement que sur deux ou trois lignes et demander à git d'ignorer complètement les autres parce que je les avais remis comme je les avais trouvés (du moins je le croyais).
0 votes
Une discussion en amont sur le même problème : kerneltrap.org/mailarchive/git/2008/4/16/1450834/thread
7 votes
@MatrixFrog: votre éditeur semble cassé, incapable de détecter automatiquement les fins de ligne. Quel est le problème? Je travaille sur des projets hybrides qui doivent avoir des fichiers LF et des fichiers CRLF dans le même dépôt. Pas de problème pour n'importe quel éditeur moderne. Faire en sorte que le contrôle de version (ou le transfert de fichiers) interfère avec les fins de ligne pour contourner les limitations de l'éditeur est la pire idée jamais - évident rien qu'à la longueur des explications ci-dessous.
7 votes
Le seul éditeur moderne que je connaisse qui fait quelque chose de mal est Visual Studio. Visual Studio ouvrira volontiers un fichier avec des fins de ligne LF. Si vous insérez ensuite de nouvelles lignes, il insérera CRLF et enregistrera des fins de lignes mélangées. Microsoft refuse de corriger cela, ce qui est une sacrée tache sur un IDE par ailleurs assez bon :--(
0 votes
Question similaire stackoverflow.com/questions/9976986/… comporte plus de détails sur la façon de réinitialiser l'index git et la gestion des sauts de ligne sur une copie de travail tout en préservant les fichiers.
0 votes
La discussion amont était sur kerneltrap ; cela semble avoir disparu maintenant. Archive Wayback : web.archive.org/web/20110805073326/http://kerneltrap.org/…
1 votes
Est-ce que ce problème persiste en 2020, dix ans après la question originale?
0 votes
La solution se trouve sur cette page, mais quelques pages plus bas stackoverflow.com/a/29888735/340142
0 votes
J'aime une question qui n'a toujours pas de réponse claire après 14 ans, et 200 commentaires de personnes qui ne sont pas d'accord et qui disent que les solutions des autres ne fonctionnent pas.
0 votes
Potentiellement de grandes répercussions...