Pourquoi git ne reconnaît-il pas que mon fichier a été modifié, donc git add ne fonctionne pas

97

J'essaye de pousser mes fichiers vers github en utilisant bash. Ils sont déjà là-bas, et je télécharge une version plus récente avec de nouvelles lignes et du code, etc. Mais quand j'essaye git addet puis git statusil dit:

Sur le maître de succursale

rien à valider, le répertoire de travail est nettoyé

Et le fichier que j'utilise vient d'être modifié.

somerandomguy
la source
4
si vous vous êtes déjà engagé, alors vous n'auriez rien à valider, vérifiez git log.
Grady Player
2
quelle est la sortie de git diff?
maazza
2
@maazza Je ne tire rien de git diff
somerandomguy
1
Si git diff(ou git status) ne montre rien qui explique pourquoi il n'y a rien à ajouter. Donc la question est vraiment: "Pourquoi git ne reconnaît-il pas que mon fichier a été modifié?"
Sunil D.
Désolé les gars, je vois ce qui se passe.git ne voit pas que Visual Studio C # l'a changé, mais il voit quand quelque chose d'autre l'a changé, comme notepad ++
somerandomguy

Réponses:

123

J'ai eu un problème où il était une fois que je définissais l'index git sur "assume inchangé" sur mon fichier.

Vous pouvez dire à git d'arrêter d'ignorer les modifications apportées au fichier avec:

git update-index --no-assume-unchanged path/to/file

Si cela n'aide pas, une réinitialisation peut suffire pour d'autres cas étranges.


Dans la pratique, j'ai trouvé la suppression du fichier mis en cache et sa réinitialisation pour qu'il fonctionne:

git rm --cached path/to/file
git reset path/to/file

Le git rm --cachedmoyen de supprimer uniquement le fichier de l'index, et resetdit à git de recharger l'index git à partir du dernier commit.

ThorSummoner
la source
15
git add -f path/to/the/fileil ajoutera de force les fichiers pour la validation.
San
2
Cette réponse était la seule qui a aidé à résoudre mon problème. Je ne sais pas si c'est un problème Windows (je n'ai jamais eu de problèmes comme celui-ci dans le passé, que ce soit sous osx ou linux). Merci donc à @ThorSummoner. Btw, j'ai essayé git add -fle fichier qui était dans cet état "supposé inchangé", et cela n'a pas fonctionné - j'ai dû soit git update-indexou git rm --cachedsuivi d'un git resetpour le faire fonctionner.
rsenna
1
De plus, si vous n'êtes vraiment pas sûr de l'état actuel de votre dépôt, procédez comme suit: git rm --cached -r .et ensuite git reset ..
rsenna
Il y a une autre option à essayer, git update-index --no-skip-worktree path/to/file
voici
1
A travaillé pour moi, mais oui, seulement des cas de dossier unique.
Thomas Cheng
24

Vérifiez votre .gitignoredossier . Vous constaterez peut-être que le fichier, l'extension du fichier ou le chemin d'accès au fichier avec .gitignorelequel vous essayez de travailler correspond à une entrée , ce qui expliquerait pourquoi ce fichier est ignoré (et non reconnu comme un fichier modifié).

Cela s'est avéré être le cas pour moi lorsque j'ai eu un problème similaire.

Marc Eliot Stein
la source
1
J'ai utilisé gitignore.io pour générer mon .gitignore et j'ai trouvé une ligne avec lib/, ce qui fait que git ignore ce dossier. Il n'y a aucun problème avec cela - du moins si ce dossier n'est pas le dossier principal de votre projet, comme ce qui m'est arrivé.
Paladini
Et pour quiconque dans mon cas, c'était en fait mon
fichier d'
Au début, cela n'a pas fonctionné. Mais, je l'ai fait fonctionner. Dans mon cas, la chose à ignorer a été mentionnée deux fois dans le fichier gitignore. Recherchez toujours toutes les occurrences et remplacez-les toutes.
MasterJoe
8

Comme cela a déjà été discuté, les fichiers ont probablement été marqués avec "assume-inchangé", ce qui dit fondamentalement à git que vous ne modifierez pas les fichiers, donc il n'a pas besoin de suivre les changements avec eux. Cependant, cela peut affecter plusieurs fichiers, et s'il s'agit d'un grand espace de travail, vous ne voudrez peut-être pas les vérifier tous un par un. Dans ce cas, vous pouvez essayer: git update-index --really-refresh

selon la documentation:

Like --refresh, but checks stat information unconditionally, without regard to the "assume unchanged" setting.

Cela forcera fondamentalement git à suivre les modifications de tous les fichiers indépendamment des indicateurs "assume-inchangé".

André Cunha
la source
1
Pour moi git status, aucun fichier n'est modifié, mais git add .ajoute deux fichiers, et git update-index --really-refreshdit que ces deux ont besoin de mises à jour, mais ne semble rien faire. Une idée?
quelqu'un avec pc
2
git status ignore les fichiers avec l'indicateur supposé inchangé. Cependant, l'utilisation de git update-index --really-refresh effacera cet indicateur et les fichiers apparaîtront maintenant. Essayez à nouveau d'exécuter git status pour voir si cela modifie maintenant les modifications. Si vous ne voyez rien, suivez ce post: stackoverflow.com/questions/2363197/… notamment la commande pour afficher une liste des fichiers qui ont les changements supposés: git ls-files -v | grep '^[[:lower:]]'si rien ne vous aide, vous devriez créer une question avec plus de détails afin que nous puissions vous aider tu.
André Cunha
7

eh bien nous n'avons pas assez pour répondre à cette question alors je vais vous donner plusieurs suppositions:

1) vous avez caché vos modifications, pour corriger le type: git stash pop

2) vous avez eu des changements et vous les avez validés, vous devriez pouvoir voir votre commit dans git log

3) vous avez fait des modifications d'une sorte git reset --hardou d'une autre, vos modifications peuvent être là dans le reflog, tapez git reflog --allsuivi de la vérification ou de la sélection de la référence si jamais vous la trouvez.

4) vous avez extrait le même repo plusieurs fois et vous vous êtes trompé.

Joueur de Grady
la source
1) aucune réserve trouvée 2) J'ai eu des modifications et je me suis engagé, puis-je recommencer? 3) Je n'ai pas fait ça 4) Je suis dans le bon repo
somerandomguy
si vous aviez des changements et les avez validés, alors vous êtes prêt à passer à l'étape suivante, pousser ou quel que soit votre flux de travail ... Vous pouvez recommencer si vous avez plus de changements, vous pouvez même git commit --amendmettre vos nouveaux changements dans votre dernier commit , ne faites pas cela si vous avez déjà partagé votre commit.
Grady Player
La fermeture et la réouverture du terminal l'ont fait pour moi après le nettoyage d'un dépôt de projet.
Eddie
6

Cela semble fou, mais parfois vous n'êtes pas dans le bon repo même si vous pensez que vous l'êtes. Par exemple, vous avez peut-être déplacé le répertoire parent, mais vous avez oublié de changer de dépôt dans votre éditeur de texte. Ou vice versa: vous êtes dans le bon référentiel dans l'éditeur de texte mais dans le mauvais référentiel en ligne de commande. Dans la première situation, vous apportez vos modifications dans le bon fichier mais ce n'est pas le même dossier qui est ouvert dans votre ligne de commande, donc c'est en fait le mauvais fichier. Dans la deuxième situation, vous avez en fait édité le bon fichier, mais votre ligne de commande git ne reconnaîtra pas la modification car vous n'êtes pas dans le bon répertoire sur la ligne de commande.

Monroe Mann
la source
4

Il s'est passé une chose géniale comme celle-ci. Le plugin git d'Eclipse Kepler marquait automatiquement tous mes dossiers de projet comme ignorés dans le dossier .gitignore.

Quand j'eu à commitle Teammenu, ils seraient tous ensemble à dos ignoré. Pour autant que je sache, c'était parce que je les avais définis comme dérivés dans le projet parent. Les décocher comme derviedcorrigé ce problème . Je n'avais jamais vu ça sur Indigo. J'espère que cela aide quelqu'un.

Joseph Lust
la source
Une idée de la façon dont ce problème peut être résolu quand il se produit dans intellij?
MasterJoe
3

Cela s'est produit sur Windows lors de la modification de fichiers en transférant les différences via l'outil WinMerge. Apparemment, WinMerge (du moins la façon dont il est configuré sur mon ordinateur) ne met parfois pas à jour les horodatages des fichiers modifiés.

Sous Windows, git status utilise, entre autres, l'horodatage d'un fichier et les modifications de la taille du fichier pour déterminer si un fichier a changé ou non. Ainsi, comme l'horodatage n'a pas été mis à jour, il ne disposait que de la taille du fichier. Malheureusement, le fichier en question était un simple fichier de version dont le contenu est passé de 7.1.2 à 7.2.0 . En d'autres termes, la taille du fichier est également restée inchangée. D'autres fichiers qui ont également été modifiés par WinMerge et dont l'horodatage n'a pas été mis à jour, mais qui avaient une taille différente après la modification ont été détectés très bien par l' état de git .

antred
la source
3

J'ai eu un problème similaire lors de l'utilisation de Sublime Text-3 . Après avoir apporté de nouvelles modifications au code et l'avoir sauvegardé, lorsque j'ai essayé les commandes git add ./status, la réponse était "branche déjà à jour". J'ai compris que, malgré l'enregistrement des mises à jour dans l'éditeur de texte, le fichier était en fait inchangé. Ouvrir le fichier dans un autre éditeur et enregistrer les modifications a fonctionné pour moi.

Balraj Gill
la source
Cela m'arrive aussi
Kloar
2

TL, DR; Êtes-vous même sur le bon référentiel?

Mon histoire est un peu drôle mais je pensais que cela pouvait arriver avec quelqu'un qui pourrait avoir un scénario similaire, alors partagez-le ici.

En fait, sur ma machine, j'avais deux référentiels git distincts repo1et repo2configurés dans le même répertoire racine nommé source. Ces deux référentiels sont essentiellement les référentiels de deux produits sur lesquels je travaille par intermittence dans mon entreprise. Maintenant, le fait est que, comme directive standard, la structure de répertoire du code source de tous les produits est exactement la même dans mon entreprise.

Donc, sans m'en rendre compte, j'ai modifié un fichier exactement du même nom dans repo2lequel je devais changer repo1. Alors, je continuais commande en cours d' exécution git statussur repo1et il a continué de donner le même message

Sur le maître de succursale

rien à valider, le répertoire de travail est nettoyé

pendant une demi-heure. Ensuite, mon collègue l'a observé comme une paire d'yeux indépendante et m'a signalé que j'étais dans un référentiel erroné mais très similaire. Le moment où je suis passé à repo1Git a commencé à remarquer les fichiers modifiés.

Cas pas si courant. Mais tu ne sais jamais!

RBT
la source
2

Avez-vous déplacé le répertoire sous votre shell? Cela peut se produire si vous avez restauré votre projet à partir d'une sauvegarde. Pour résoudre ce problème, cdsortez et revenez:

cd ../
cd -
SilverWolf - Réintégrer Monica
la source
Wow, c'était le cas. Fou. Un autre truc n'a pas du tout fonctionné!
Makalele
1

En général, avec ce problème, vérifiez d'abord que vous modifiez le fichier que vous pensez être! J'ai eu ce problème lorsque je modifiais un fichier JavaScript transpilé au lieu du fichier source (la version transpilée n'était pas sous le contrôle de la source).

Chris Halcrow
la source
merci d'avoir mentionné cela! J'étais tellement convaincu que je mettais à jour le bon fichier. Nan. face palm
Ashley Grenon
1

Mon client Git (Gitg) a causé ce problème pour moi. Les commandes normales que j'exécutais habituellement ne fonctionnaient pas. Même toucher tous les fichiers du projet ne fonctionnait pas.

J'ai trouvé un moyen de le réparer et je ne sais toujours pas ce qui l'a causé. Copiez votre répertoire de projet. Les fichiers manquants apparaîtront dans le répertoire copié git status. Renommer peut faire la même chose.

Kagronick
la source
1

Ran dans le problème, mais il n'y avait que deux répertoires et je ne savais pas que ces deux répertoires ont fini par être configurés en tant que sous-modules git. Comment cela s'est-il passé, je n'en ai aucune idée, mais le processus consistait à suivre certaines des instructions sur ce lien, mais PAS à supprimer le répertoire (comme il le fait à la fin) mais plutôt à le fairegit add path/to/dir

Andrew Lank
la source
1

Lorsque vous modifiez un fichier dans Visual Studio, il est répertorié instantanément dans les modifications git, même si le fichier n'est pas enregistré. Il vous suffit donc de sauvegarder le fichier manuellement (Ctrl + S pour le fichier actuellement affiché ou Ctrl + Shift + S pour tous les fichiers du projet) et git bash les récupérera.

Yaugenka
la source
Cela a fonctionné pour moi lors de l'ajout de commentaires à un .jsfichier, en travaillant avec Visual Studio Code. Je vous remercie.
SnuKies
0

Quel type de fichier avez-vous essayé de télécharger? Maintenant, je passe presque une heure à télécharger ma modification css. Mais ce css compilé à partir d'un fichier styl donc git l'a simplement ignoré. Lorsque j'ai changé la source de style, tout a fonctionné.

J'espère que ça aide.

Paxi
la source
0

Cela dépend parfois et par version de git et si vous oubliez de le faire git add ..

Pour vérifier votre modification sur le référentiel, utilisez toujours git statuscette option pour afficher tous les fichiers non suivis et modifiés. Parce que git diffmontrer uniquement les fichiers ajoutés.

onalbi
la source
0

Assurez-vous de ne pas créer de liens symboliques ( ln -s source dest) à l'intérieur de Git Bash pour Windows.

Il ne crée PAS de liens symboliques, mais fait une copie DEEP de la source vers la destination

J'ai eu le même comportement que OP sur un terminal MINGW64 de Git Bash pour Windows (version 2.16.2) pour réaliser que mes modifications `` éditées '' se trouvaient en fait dans le répertoire d'origine et que mes commandes git bash provenaient d'une copie profonde qui était restée inchangé.

StevenWernerCS
la source
0

J'ai eu le même problème. Il s'avère que j'avais deux copies du projet et que mon terminal était dans le mauvais dossier de projet!

zar
la source
0

Cela m'est aussi arrivé, j'ai essayé les méthodes mentionnées ci-dessus et rien n'y a aidé. Ensuite, la solution était de changer le fichier via le terminal, pas l'interface graphique. Je ne sais pas pourquoi cela a fonctionné mais a fonctionné. Après avoir édité le fichier via nano à partir du terminal, git l'a reconnu comme modifié et j'ai pu l'ajouter et le valider.

Zed895
la source
Avez-vous trouvé une solution pour cela? Je me suis battu avec mon git pour ne pas reconnaître mes fichiers modifiés lorsque j'utilise un outil de fusion, et le seul moyen d'obtenir git pour voir les changements est d'utiliser nano pour mes fusions, ce qui prend beaucoup plus de temps. Les fichiers en conflit sont initialement visibles par git, après avoir été modifiés par l'outil de fusion, ils apparaissent comme "inchangés" sur git.
Lucas P.
Je ne sais pas pourquoi cela fonctionne et comment cela fonctionne mais cela fonctionne pour moi merci
Amit Bisht
0

J'ai le même problème ici VS2015 n'a pas reconnu les modifications de mes fichiers js, la suppression des télécommandes des paramètres du référentiel, puis la réajout du chemin d'URL distant a résolu mon problème.

Muzafar Hasan
la source
0

J'ai eu un problème similaire lorsque j'ai créé un fichier de correctif sur le serveur avec l'éditeur vi. Il semble que le problème soit lié à l'espacement. Quand j'ai poussé le patch depuis le local, le déploiement était correct.

Pkrishna
la source
-1

J'ai eu ce problème. Le mien ne fonctionnait pas car je mettais mes fichiers dans le dossier .git de mon projet.

Lafsnb
la source
-1

Dans mon cas, faire un git reset --hard des fichiers supprimés et laisser des dossiers vides. Après avoir inspecté le contenu, j'ai remarqué que les répertoires étaient vides.

Cependant, git ignore les dossiers vides. (Correction, git ignore tous les répertoires car il suit le contenu, les dossiers vides ne sont pas du contenu.)

poubelle
la source
-4

essayez d'utiliser git add * alorsgit commit

Tih Haur
la source
1
Bienvenue à SO! Cela ne répond probablement pas à la question, et il y a déjà 9 réponses ici. Veuillez orienter vos efforts vers des questions qui nécessitent une réponse!
Cris Luengo