Cause possible n°1 - Normalisation de la fin de la ligne
Cela peut se produire lorsque le fichier en question a été archivé dans le référentiel sans la configuration correcte des fins de ligne (1), ce qui donne un fichier dans le référentiel avec des fins de ligne incorrectes ou des fins de ligne mixtes. Pour confirmer, vérifiez que git diff
ne montre que les changements dans les fins de ligne (ceux-ci peuvent ne pas être visibles par défaut, essayez git diff | cat -v
pour voir les retours de chariot comme littéraux ^M
caractères).
Par la suite, quelqu'un a probablement ajouté un .gitattributes
ou modifié le core.autocrlf
pour normaliser les fins de ligne (2). Sur la base de la .gitattributes
ou la configuration globale, Git a appliqué des changements locaux à votre copie de travail qui appliquent la normalisation de fin de ligne demandée. Malheureusement, pour une raison quelconque git reset --hard
n'annule pas ces changements de normalisation des lignes.
Solution
Les solutions de contournement dans lesquelles les terminaisons de lignes locales sont réinitialisées ne résoudront pas le problème. Chaque fois que le fichier est "vu" par git, il essaie de réappliquer la normalisation, ce qui entraîne le même problème.
La meilleure option est de laisser git appliquer la normalisation qu'il souhaite en normalisant toutes les fins de lignes dans le repo pour qu'elles correspondent à l'option .gitattributes
et de valider ces changements -- voir J'essaie de corriger les fins de lignes avec git filter-branch, mais je n'ai pas de chance. .
Si vous voulez vraiment essayer de revenir sur les modifications apportées au fichier manuellement, la solution la plus simple semble être d'effacer les fichiers modifiés, puis de demander à git de les restaurer, bien que je note que cette solution ne semble pas fonctionner de manière cohérente 100% du temps ( AVERTISSEMENT : NE PAS exécutez ceci si vos fichiers modifiés ont des changements autres que des fins de ligne ! !!):
git status --porcelain | grep "^ M" | cut -c4- | xargs rm
git checkout -- .
Notez que, à moins que vous ne normalisiez les fins de ligne dans le référentiel à un moment donné, vous continuerez à rencontrer ce problème.
Cause possible n° 2 - Insensibilité à la casse
La deuxième cause possible est l'insensibilité à la casse sous Windows ou Mac OS/X. Par exemple, disons qu'un chemin comme le suivant existe dans le référentiel :
/foo/bar
Maintenant, quelqu'un sur Linux commet des fichiers dans /foo/Bar
(probablement à cause d'un outil de construction ou autre qui a créé ce répertoire) et pousse. Sous Linux, il s'agit en fait de deux répertoires distincts :
/foo/bar/fileA
/foo/Bar/fileA
L'utilisation de ce dépôt sous Windows ou Mac peut entraîner des modifications de l'environnement de travail. fileA
qui ne peuvent pas être réinitialisés, parce qu'à chaque réinitialisation, git sur Windows vérifie /foo/bar/fileA
et, parce que Windows ne tient pas compte des majuscules et des minuscules, il écrase le contenu de l'adresse suivante fileA
con /foo/Bar/fileA
ce qui fait qu'ils sont "modifiés".
Un autre cas peut être un ou plusieurs fichiers individuels qui existent dans le dépôt et qui, lorsqu'ils sont extraits sur un système de fichiers insensible à la casse, se chevauchent. Par exemple :
/foo/bar/fileA
/foo/bar/filea
D'autres situations similaires peuvent être à l'origine de tels problèmes.
git sur les systèmes de fichiers insensibles à la casse devrait vraiment détecter cette situation et afficher un message d'avertissement utile, mais ce n'est pas le cas actuellement (cela pourrait changer dans le futur -- voir cette discussion et les correctifs proposés connexes sur la liste de diffusion git.git).
Solution
La solution consiste à faire coïncider le cas des fichiers dans l'index git et le cas du système de fichiers Windows. Cela peut être fait soit sous Linux, ce qui montrera l'état réel des choses, soit sous Windows avec un utilitaire open source très utile. Git-Unite . Git-Unite appliquera les changements de cas nécessaires à l'index git, qui pourra ensuite être commité dans le repo.
(1) Il s'agit probablement de quelqu'un qui utilise Windows, sans aucune connaissance de l'anglais. .gitattributes
pour le fichier en question, et en utilisant le paramètre global par défaut pour le fichier core.autocrlf
qui est false
(voir (2)).
(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/
0 votes
Avez-vous appliqué ces commandes depuis la racine du référentiel ? Notez
.
correspond au répertoire courant et non au répertoire racine1 votes
Je les ai fait à partir du dépôt Root en effet.
0 votes
Quel est votre
git
version ? Soit vous faites une erreur stupide, soit vous avez une ancienne version qui présente des bogues ?0 votes
C'est git 1.7.4 msysgit. C'est peut-être une erreur, mais les commandes semblent assez simples, et je n'ai pas pu repérer d'erreur.
0 votes
Pour mémoire, j'ai essayé d'utiliser la dernière version de msysgit (1.7.11), mais le problème persiste.
0 votes
Même problème, j'ai ajouté
.gitattributes
sur une machine (Windows) et maintenant sur une autre (Linux) après le tirage depuis le dépôt principal, certains fichiers semblent modifiés, notamment ceux qui onteol=crlf
...0 votes
Le bon correctif serait d'utiliser git history rewrite