À propos des fins de ligne
Chaque fois que vous appuyez sur retour sur votre clavier, vous insérez un caractère invisible appelé fin de ligne. Les fins de ligne sont traitées différemment selon le système d'exploitation.
Quand vous collaborez sur des projets avec Git et GitHub, Git peut produire des résultats inattendus si, par exemple, vous travaillez sur une machine Windows et que votre collaborateur a effectué un changement sur macOS.
Vous pouvez configurer Git pour traiter automatiquement les fins de ligne afin de pouvoir collaborer efficacement avec des personnes qui utilisent des systèmes d’exploitation différents.
Paramètres généraux des fins de ligne
La commande git config core.autocrlf
est utilisée pour changer la façon dont Git traite les fins de ligne. Elle prend un seul argument.
Sur macOS, vous passez simplement input
dans la configuration. Par exemple :
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS
Sur Windows, vous passez simplement true
dans la configuration. Par exemple :
$ git config --global core.autocrlf true
# Configure Git to ensure line endings in files you checkout are correct for Windows.
# For compatibility, line endings are converted to Unix style when you commit files.
Sur Linux, vous passez simplement input
dans la configuration. Par exemple :
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux
Paramètres par dépôt
Vous pouvez aussi configurer un fichier .gitattributes
pour gérer la façon dont Git lit les fins de ligne dans un dépôt spécifique. Quand vous commitez ce fichier dans un dépôt, il remplace le paramètre core.autocrlf
pour tous les contributeurs du dépôt. Cela garantit un comportement cohérent pour tous les utilisateurs, quels que soient leurs paramètres et leur environnement Git.
Le fichier .gitattributes
doit être créé à la racine du dépôt et commité comme n’importe quel autre fichier.
Un fichier .gitattributes
ressemble à un tableau avec deux colonnes :
- À gauche, le nom de fichier que Git doit mettre en correspondance.
- À droite, la configuration de fin de ligne que Git doit utiliser pour ces fichiers.
Exemple
Voici un exemple de fichier .gitattributes
. Vous pouvez l’utiliser comme modèle pour vos dépôts :
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
Notez que les fichiers sont mis en correspondance (*.c
, *.sln
, *.png
) séparés par un espace, puis reçoivent un paramètre (text
, text eol=crlf
, binary
). Voyons quelques-uns des paramètres possibles.
-
text=auto
: Git traite les fichiers avec la méthode qui lui paraît la plus appropriée. C’est une bonne option par défaut. -
text eol=crlf
: Git convertit toujours les fins de ligne enCRLF
au moment du basculement sur une branche. Vous devez l’utiliser pour les fichiers qui doivent conserver les finsCRLF
, même sur OSX ou Linux. -
text eol=lf
: Git convertit toujours les fins de ligne enLF
au moment du basculement sur une branche. Vous devez l’utiliser pour les fichiers qui doivent conserver les fins LF, même sur Windows. -
binary
: Git comprend que les fichiers spécifiés ne sont pas du texte et qu’il ne doit pas essayer de les changer. Le paramètrebinary
est également un alias de-text -diff
.
Actualisation d’un dépôt après changement des fins de ligne
Après avoir défini l’option core.autocrlf
ou commité un fichier .gitattributes
, Git modifie automatiquement les fins de ligne pour qu’elles correspondent à votre nouvelle configuration. Vous remarquerez peut-être que Git signale des changements sur des fichiers que vous n’avez pas modifiés.
Pour vous assurer que toutes les fins de ligne de votre dépôt correspondent à votre nouvelle configuration, sauvegardez vos fichiers avec Git, puis supprimez et restaurez tous les fichiers pour normaliser les fins de ligne.
-
Avant d’ajouter ou de commiter des modifications, vérifiez que Git a correctement appliqué la configuration. Par exemple, Git détermine automatiquement si les fichiers d’un dépôt sont des fichiers texte ou binaires. Pour éviter l’altération des fichiers binaires dans votre dépôt, nous vous recommandons de marquer explicitement les fichiers comme binaires dans
.gitattributes
. Pour plus d’informations, consultez gitattributes - Définition d’attributs par chemin dans la documentation Git. -
Pour éviter de perdre les modifications locales apportées aux fichiers dans le dépôt, ajoutez et commitez les modifications en suspens en exécutant les commandes suivantes.
Shell git add . -u git commit -m "Saving files before refreshing line endings"
git add . -u git commit -m "Saving files before refreshing line endings"
-
Pour mettre à jour tous les fichiers de la branche actuelle afin de refléter la nouvelle configuration, exécutez les commandes suivantes.
Shell git rm -rf --cached . git reset --hard HEAD
git rm -rf --cached . git reset --hard HEAD
-
Pour afficher les fichiers normalisés réécrits, exécutez la commande suivante.
Shell git status
git status
-
Si vous le souhaitez, pour commiter les modifications en suspens dans votre dépôt, exécutez la commande suivante.
Shell git commit -m "Normalize all the line endings"
git commit -m "Normalize all the line endings"
Pour aller plus loin
- Personnalisation de Git - Attributs Git dans la documentation Pro Git
- git-config dans les pages man pour Git
- Bien démarrer - Première configuration de Git dans la documentation Pro Git
- Mind the End of Your Line de Tim Clem