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
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 avecLF
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
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.
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 .
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.
Si vous
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 .
Placez un fichier .gitattributes
à la racine de votre référentiel git ayant le contenu suivant:
* text=auto eol=lf
Engagez-le.
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
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.