J'ai cloné un référentiel qui avait des fins de ligne incohérentes. J'ai ajouté un .gitattributes
qui définit l'attribut de texte pour les fichiers que je souhaite normaliser. Maintenant, lorsque je valide des modifications, je reçois le message:
warning: CRLF will be replaced by LF in FILE.
The file will have its original line endings in your working directory.
Comment puis-je faire git normaliser ma copie de travail du fichier pour moi? De préférence, je voudrais que git normalise tout l'arbre de travail.
Avec Git client 2.16 et supérieur, il existe désormais un moyen beaucoup plus simple de le faire. Utilisez simplement git add --renormalize .
Pour ceux qui utilisent la v2.16 ou supérieure, vous pouvez simplement utiliser:
git add --renormalize . # Update index with renormalized files
git status # Show the files that will be normalized
git commit -m "Introduce end-of-line normalization"
Ces directions sont tout droit sorties des gitattributes . Pour les versions plus anciennes, les docs (avant la v2.12) fournissent une réponse différente:
rm .git/index # Remove the index to force git to
git reset # re-scan the working directory
git status # Show files that will be normalized
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"
Effectuez cette séquence après avoir modifié .gitattributes
.
Il semble que certains utilisateurs aient eu des problèmes avec les instructions ci-dessus. La documentation mise à jour pour gitattributes (2.12 à 2.14) montre un nouvel ensemble d'instructions (après avoir édité les fichiers .gitattributes):
git read-tree --empty # Clean index, force re-scan of working directory
git add .
git status # Show files that will be normalized
git commit -m "Introduce end-of-line normalization"
Merci à @ vossad01 pour l'avoir signalé.
De plus, avec les deux solutions, les fichiers de votre copie de travail conservent toujours leurs anciennes fins de ligne. Si vous souhaitez les mettre à jour, assurez-vous que votre arborescence de travail est propre et utilisez:
git rm --cached -r .
git reset --hard
Maintenant, les fins de ligne seront correctes dans votre arbre de travail.
Assurez-vous que vous n'avez aucune modification en attente dans le référentiel:
$ git status
$ git stash
Modifier .gitattributes
donc l'interprétation CRLF sera modifiée:
$ echo "*.txt text" >>.gitattributes
$ git commit -m "Made .txt files a subject to CRLF normalization." -- .gitattributes
Supprimez les données de l'index et actualisez le répertoire de travail:
$ git rm --cached -r .
$ git reset --hard
Examinez les correctifs CRLF proposés par Git:
$ git ls-files --eol
$ git status
$ git diff
D'accord avec la décision de Git:
$ git add -u
$ git commit -m "Normalized CRLF for .txt files"
Rechargez les modifications comme si un clone propre avait été effectué:
$ git rm --cached -r .
$ git reset --hard
Les paramètres .gitattributes
N'affecteront que les nouveaux validations. Si ce référentiel n'a aucun historique publié (aucun autre en fonction), vous voudrez peut-être parcourir tout l'historique. Sous Unix/Linux, vous pouvez utiliser dos2unix(1)
pour corriger tous les fichiers en combinaison avec find(1)
, et en utilisant la réécriture de l'historique de filter-branch
(Voir discussion dans le git book), vous pouvez même nettoyer l'historique complet du projet.
A utiliser avec le plus grand soin, sur un clone frais. Entrez en contact avec toute personne qui pourrait avoir un clone, et dites-lui ce que vous voulez faire.
L'option * text = auto dans .gitattributes laisse le référentiel Git dans un `` état illégal '' s'il contient des fichiers avec des fins de ligne CRLF (Windows) qui sont désormais marquées comme du texte (voir https://marc.info/ ? l = git & m = 154484903528621 & w = 2 ). L'option de renormalisation standard ne fonctionne pas correctement avec les filtres LFS, donc les instructions dans les autres réponses ou par exemple sur https://help.github.com/en/articles/dealing-with-line-endings , ne fonctionne pas correctement. Au lieu de cela, ces étapes ont fonctionné pour nous:
Situation:
A également changé le -crlf en -text pour les fichiers suivis LFS, pas sûr que ce soit nécessaire.