web-dev-qa-db-fra.com

Le statut de Git montre les fichiers modifiés mais Git Diff ne le fait pas

J'ai jeté un coup d'œil à toutes les questions similaires, mais j'ai vérifié deux fois et quelque chose d'étrange se produit.

Sur un serveur (Solaris avec git 1.8.1), j'ai cloné le référentiel git, puis copié le dossier .git dans mes fichiers live existants. Cela fonctionnait parfaitement, je pouvais courir

git status

ensuite

git diff [filename]

pour vérifier tous les fichiers qui étaient différents.

Sur un autre serveur (Solaris avec git 1.7.6), je fais exactement la même chose cependant.

git diff [filename] 

ne montre rien, même si le contenu du fichier est vraiment différent. J'ai également essayé d'ajouter un nouveau fichier, de le valider puis de le modifier. Même problème, git status montre le fichier modifié mais git diff ne montre rien. Si je télécharge le fichier modifié et exécute un diff localement, je reçois une sortie diff.

149
Oliver P

J'ai ajouté le fichier au index :

git add file_name

et ensuite couru:

git diff --cached file_name

Vous pouvez voir la description de git diff ici .

Si vous avez besoin d’annuler votre ajout à git, veuillez consulter le lien suivant: Comment annuler l’ajout de git avant le commit?

68
Adrian Mann

Il y a quelques raisons pour lesquelles git status peut montrer une différence mais git diff ne le peut pas.

  • Le mode (bits d'autorisation) du fichier a changé, par exemple de 777 à 700.

  • Le style de saut de ligne est passé de CRLF (DOS) à LF (UNIX)

Le moyen le plus simple de savoir ce qui s'est passé est d'exécuter git format-patch HEAD^ et de voir ce que dit le correctif généré.

54
cmccabe

Pour moi, cela avait quelque chose à voir avec les autorisations de fichiers. Quelqu'un avec Mac/Linux sur mon projet semble valider certains fichiers avec des autorisations autres que celles par défaut que mon client Windows Git n'a pas réussi à reproduire. La solution pour moi était de dire à git d’ignorer les autorisations de fichiers:

git config core.fileMode false

Autres informations: Comment puis-je faire en sorte que Git ignore les changements de mode de fichier (chmod)?

46
Alex Abdugafarov

J'ai eu un problème où des centaines de fins de lignes ont été modifiées par certains programmes et git diff a répertorié tous les fichiers sources modifiés. Après avoir corrigé les fins de ligne, le statut de git répertorie toujours les fichiers modifiés.

J'ai pu résoudre ce problème en ajoutant tous les fichiers à indexer, puis en réinitialisant l'index.

git add -A
git reset

core.filemode était défini sur false.

32
Jaakko

Je soupçonne que quelque chose ne va pas avec votre installation de git ou votre référentiel.

Essayez de courir:

GIT_TRACE=2 git <command>

Voyez si vous obtenez quelque chose d'utile. Si cela ne vous aide pas, il suffit de regarder et de voir ce qui ne va pas:

strace git <command>
17
user1338062

J'ai eu un problème similaire: git diff montrerait des différences, mais git diff <filename> ne le ferait pas. Il s'est avéré que j'ai défini LESS sur une chaîne contenant -F (--quit-if-one-screen). La suppression de ce drapeau a résolu le problème.

10
rcwxok

Couru dans ce problème. Mon cas était similaire au numéro LESS publié par @rcwxok.

Dans mon cas, je règle la variable PAGERenvironnement sur PAGER='less -RSF'.

Cependant, contrairement aux réponses précédentes, je ne voulais pas supprimer l'option -F, car je la mettais explicitement dans cet espoir d'éviter d'afficher le diff dans less s'il est plus court qu'un écran.

Pour obtenir le résultat souhaité, au lieu de supprimer -F, j'ai ajouté -X: PAGER='less -RSFX'. Cela a résolu le problème de git diff et a également évité d'afficher des différences courtes avec less.

J'espère que ça aide quelqu'un.

5
avivr

Réponse courte

Exécuter git add aide parfois.

Exemple

Le statut de Git montre les fichiers modifiés et le diff de Git ne montre rien ...

> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   package.json

no changes added to commit (use "git add" and/or "git commit -a")
> git diff
> 

... exécuter git add résout l'incohérence.

> git add
> git status
On branch master
nothing to commit, working directory clean
> 
4
Shaun Luttin

Je viens de courir dans un problème similaire. git diff file ne montre rien car j'ai ajouté un fichier à l'index git avec une partie de son nom en majuscule: GeoJSONContainer.js. Ensuite, je l'ai renommé en GeoJsonContainer.js et les modifications ne sont plus suivies. git diff GeoJsonContainer.js ne montrait rien. J'ai dû supprimer le fichier de l'index avec un indicateur de force, puis rajouter le fichier:

git rm -f GeoJSONContainer.js 
git add GeoJSONContainer.js
3
Alexandr Lazarev

Vous n'avez pas vraiment posé de question, mais comme il s'agit d'un cas d'usage général, j'utilise souvent ce que je fais. Vous pouvez essayer cela vous-même et voir si l'erreur persiste.

Mon hypothèse sur votre cas d'utilisation: vous avez un répertoire existant contenant des fichiers et des répertoires et vous souhaitez maintenant le convertir en un référentiel git qui est cloné ailleurs sans changer les données de votre répertoire actuel.

Il y a vraiment deux façons.

Clone repo - mv .git - réinitialisation de git - hard

Vous avez utilisé cette méthode: pour cloner le référentiel existant dans un répertoire vide, puis déplacez le répertoire .git dans le répertoire de destination. Pour travailler sans problèmes, cela nécessite généralement de lancer

git reset --hard

Cependant, cela modifierait l'état des fichiers de votre répertoire actuel. Vous pouvez essayer ceci sur une copie complète/rsync de votre répertoire et étudier les modifications. Au moins après cela, vous ne devriez plus voir les différences entre git log et status.

Init new nouveau repo - pointer sur Origin

La seconde est moins dérangeante: entrez votre destination et démarrez un nouveau dépôt avec

git init

Ensuite, vous indiquez à ce nouveau référentiel qu’il a un ancêtre ailleurs:

git remote add Origin original_git_repo_path

Puis en toute sécurité

git fetch Origin master

copier sur les données sans changer vos fichiers locaux. Tout devrait bien se passer maintenant.

Je recommande toujours le deuxième moyen pour être moins sujet aux erreurs.

2
cfi

J'ai eu ce même problème décrit de la manière suivante: Si j'ai tapé

$ git diff 

git est simplement retourné à l'invite sans erreur.

Si j'ai tapé

$ git diff <filename>

git est simplement retourné à l'invite sans erreur.

Enfin, en lisant autour de moi, j'ai remarqué que git diff appelle en fait le mingw64\bin\diff.exe pour effectuer le travail.

Voici le deal. Je suis sous Windows et j’ai installé un autre utilitaire bash, qui a changé mon chemin afin de ne plus pointer vers mon répertoire mingw64\bin.

Donc, si vous tapez: git diff et qu’il revient simplement à l’invite, vous risquez d’avoir ce problème.

Le fichier diff.exe actuel géré par git se trouve dans votre répertoire mingw64\bin

Enfin, pour résoudre ce problème, j'ai en fait copié mon répertoire mingw64\bin à l'emplacement dans lequel git le cherchait. Je l'ai essayé et cela ne fonctionnait toujours pas.

Ensuite, j'ai fermé ma fenêtre git bash et je l'ai rouverte, puis je suis allée sur mon même dépôt qui échouait et maintenant cela fonctionne.

J'espère que ça va t'aider aussi.

1
raddevus

Je suis tombé sur ce problème à nouveau. Mais cette fois, cela s'est produit pour une raison différente. J'avais copié des fichiers dans le référentiel pour écraser les versions précédentes. Maintenant, je peux voir que les fichiers sont modifiés, mais diff ne renvoie pas les diff.

Par exemple, j'ai un fichier mainpage.xaml. Dans l'explorateur de fichiers, j'ai collé un nouveau fichier mainpage.xaml par-dessus celui de mon référentiel actuel. J'ai fait le travail sur une autre machine et juste collé le fichier ici.
git shows modified

Le fichier montre modifié, mais lorsque je lance git diff, il ne montrera pas les modifications. C'est probablement parce que le fichier info du fichier a changé et que git sait que ce n'est pas vraiment le même fichier. Intéressant.

git diff shows nothing

Vous pouvez voir que lorsque je lance diff sur le fichier, il ne montre rien, renvoie simplement l'invite.

1
raddevus

Comme déjà noté ci-dessus , cette situation peut survenir en raison de problèmes de fin de ligne (CRLF vs LF). J'ai résolu ce problème (sous la version 2.22.0 de git) avec cette commande:

git add --renormalize .

Selon le manuel:

       --renormalize
           Apply the "clean" process freshly to all tracked files to
           forcibly add them again to the index. This is useful after
           changing core.autocrlf configuration or the text attribute in
           order to correct files added with wrong CRLF/LF line endings.
           This option implies -u.
1
Stefano M