web-dev-qa-db-fra.com

Comment forcer git à utiliser LF à la place de CR + LF sous Windows?

Je veux forcer git à extraire les fichiers sous Windows en utilisant simplement LF pas CR+LF. J'ai vérifié les deux options de configuration mais je n'ai pas pu trouver la bonne combinaison de paramètres.

Je veux qu'il convertisse tous les fichiers en LF et conserve le LF sur les fichiers.

Remarque: j'ai utilisé autocrlf = input mais cela ne fait que réparer les fichiers lorsque vous les validez. Je veux le forcer à les utiliser avec LF.

Je n’étais probablement pas aussi clair: le référentiel utilise déjà LF mais les fichiers extraits à l’aide de msysgit utilisent CR+LF et je veux forcer msysgit à les obtenir avec LF: - forçant les fins de ligne Unix.

>git config --list | grep crlf
core.autocrlf=input
284
sorin

Le PO a ajouté dans sa question:

les fichiers extraits à l'aide de msysgit utilisent CR+LF et je veux forger msysgit pour les obtenir avec LF

Une première étape simple serait toujours dans un fichier .gitattributes:

*.txt -crlf

, afin d’éviter toute conversion de fichier crlf pour les fichiers avec une eol correcte.

Voir Meilleures pratiques pour la configuration git multi-plateformes?


Mais une deuxième étape plus puissante implique un pilote de filtre gitattribute et ajoute une étape de maculage

filter driver

Chaque fois que vous mettriez à jour votre arbre de travail, un script pourrait, uniquement pour les fichiers que vous avez spécifiés dans le .gitattributes, forcer le LF eol et toute autre option de formatage que vous souhaitez appliquer.
Si le script "clear" ne fait rien, vous aurez (après validation) transformé vos fichiers, en appliquant exactement le format que vous souhaitez qu'ils respectent.

82
VonC

Pour obtenir les fins de LF dans Windows, vous devez d'abord définir core.autocrlf sur false:

git config --global core.autocrlf false

Vous devez le faire si vous utilisez msysgit, car il le définit sur true dans ses paramètres système.

Maintenant, git ne fera aucune normalisation de fin de ligne. Si vous souhaitez que les fichiers que vous archivez soient normalisés, procédez comme suit: Définissez text=auto dans votre .gitattributes pour tous les fichiers:

* text=auto

Et définissez core.eol sur lf:

git config --global core.eol lf

Maintenant, vous pouvez également basculer sur un seul dépôt en crlf (dans le répertoire de travail!) En exécutant

git config core.eol crlf

Après avoir terminé la configuration, vous voudrez peut-être que git normalise tous les fichiers du repo. Pour ce faire, allez à la racine de votre dépôt et exécutez les commandes suivantes:

git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f

Si vous voulez maintenant que git normalise également les fichiers de votre répertoire de travail, exécutez les commandes suivantes:

git ls-files -z | xargs -0 rm
git checkout .
395
Chronial

J'y reviens assez souvent, bien qu'aucune d'entre elles ne me convienne. Cela dit, la bonne réponse pour moi est un mélange des autres.

Ce que je trouve fonctionne est la suivante:

 git config --global core.eol lf
 git config --global core.autocrlf input

Pour les pensions qui ont été extraites après la définition de ces paramètres globaux, tout sera extrait comme quoi que ce soit dans le dépôt - heureusement LF (\n). Toute CRLF sera convertie en LF uniquement à l'enregistrement.

Avec un référentiel existant que vous avez déjà extrait - dont les fins de ligne sont correctes, mais pas votre copie de travail - vous pouvez exécuter les commandes suivantes pour le corriger:

git rm -rf --cached .
git reset --hard HEAD

Ceci supprimera (rm) récursivement (r) sans Invite (-f), tous les fichiers sauf ceux que vous avez édités (--cached), du répertoire en cours (.). La reset renvoie ensuite tous ces fichiers à un état dans lequel ils ont leur vraie fin de ligne (correspondant à ce qu'il y a dans le référentiel).

Si vous avez besoin de corriger les fins de ligne des fichiers dans un référentiel, je vous recommande de vous procurer un éditeur qui vous permettra de le faire en bloc, comme IntelliJ ou Sublime Text, mais je suis sûr que tout bon supportera probablement cela.

192
Ben Liyanage

Le contexte

Si vous

  1. vouloir forcer tous les utilisateurs à avoir LF fins de lignes pour les fichiers texte et
  2. vous ne pouvez pas vous assurer que tous les utilisateurs changent leur configuration git,

vous pouvez le faire à partir de git 2.10. 2.10 ou une version ultérieure est requise, car 2.10 a corrigé le comportement de text = auto avec eol = lf . Source .

Solution

Placez un fichier .gitattributes à la racine de votre référentiel git ayant le contenu suivant:

* text=auto eol=lf

Engagez-le.

Réglages optionnels

Vous pouvez également ajouter un .editorconfig à la racine de votre référentiel pour vous assurer que les outils modernes créent de nouveaux fichiers avec les fins de ligne souhaitées.

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
39
koppor

core.autocrlf=input est le bon réglage pour ce que vous voulez, mais vous devrez peut-être faire un git update-index --refresh et/ou un git reset --hard pour que les modifications prennent effet.

Avec core.autocrlf réglé sur input, git n’appliquera pas la conversion de nouvelle ligne à la caisse (donc, si vous avez LF dans le repo, vous obtiendrez LF). veillera à ce que, si vous vous trompez et introduisiez des CRLF dans la copie de travail, ils ne se retrouveront pas dans le référentiel.

26
kusma