Pourquoi Git n'ignore-t-il pas mon fichier spécifié?


207

J'ai ajouté la ligne suivante à .gitignore:

sites/default/settings.php

mais quand je tape, git statusil montre le fichier en tant que fichier non mis en scène.

Quel est le problème? Tous les autres modèles fonctionnent bien.



J'ai eu le même problème, puis j'ai découvert que j'avais enregistré mon fichier .gitignore sur un autre lecteur à la place: face-palm:
Henry

C'est une très mauvaise idée de conserver des éléments dans votre référentiel et d'ignorer les modifications qu'il contient.
Yevgeniy Afanasyev

Réponses:


396

Assurez-vous que votre se .gitignoretrouve à la racine du répertoire de travail, et dans ce répertoire, exécutez git statuset copiez le chemin d'accès au fichier à partir de la sortie d'état et collez-le dans le fichier .gitignore.

Si cela ne fonctionne pas, il est probable que votre fichier soit déjà suivi par Git. Vous pouvez le confirmer via la sortie de git status. Si le fichier n'est pas répertorié dans la section «Fichiers non suivis» , alors il est déjà suivi par Git et il ignorera la règle du .gitignorefichier.

La raison d'ignorer les fichiers dans Git est qu'ils ne seront pas ajoutés au référentiel. Si vous avez précédemment ajouté un fichier que vous souhaitez ignorer, il sera suivi par Git et les règles d'ignorance correspondant seront ignorées. Git fait cela puisque le fichier fait déjà partie du référentiel.

Pour ignorer réellement le fichier, vous devez le décompresser et le supprimer du référentiel. Vous pouvez le faire en utilisant git rm --cached sites/default/settings.php. Cela supprime le fichier du référentiel sans supprimer physiquement le fichier (c'est ce que --cachedfait). Après avoir validé cette modification, le fichier sera supprimé du référentiel et l'ignorer devrait fonctionner correctement.


Qu'entendez-vous par «racine du répertoire de travail»? Le répertoire où se trouve le dépôt '.git'?
Jonathan Leffler

Le répertoire de travail est le répertoire dans lequel .gitse trouve le répertoire et qui est lui-même la racine du référentiel. Comme lorsque vous cloner un dépôt pour /xy/ensuite /xy/est votre répertoire de travail avec l' /xy/.git/intérieur.
poke le

3
Parfois, vous devrez également faire un git add .après git rm --cachedpour reconstruire correctement l'index.
Cooper

L'idée de le vérifier dans le statut git était géniale. J'ai continué à le vérifier dans Git Staging dans Eclipse et le chemin était incorrect. Merci!
walla

1
J'avais besoin d'ajouter l'indicateur -r (récursif) car j'avais également archivé des dossiers imbriqués. Dans mon cas, j'ai déplacé à la racine de mon dossier git puis j'ai exécuté la commande git rm --cached -r .vs / Où vs était le dossier de niveau supérieur que je voulais supprimer du suivi.
Devology Ltd

114

Je rencontre ceci, c'est une vieille question, mais je veux que ce fichier soit suivi mais ne pas le suivre sur certaines copies de travail, pour ce faire, vous pouvez exécuter

git update-index --assume-unchanged sites/default/settings.php

5
C'est en fait la réponse que je cherchais. Toutes les autres réponses supposent que le fichier a été ajouté avec git add, ce qui n'est pas toujours le cas. Avec Acquia Cloud, le fichier .gitignore est censé ignorer settings.php (par exemple) mais le fichier est inclus avec le premier commit. En supprimant le suivi du fichier, il suffit de le supprimer du référentiel, donc de le supprimer du site en direct ...
PatrickS

M'a aidé aussi - merci! Voté. Je soupçonne que cela s'applique uniquement au repo git local et ne persisterait pas une fois poussé vers distant et cloné par d'autres développeurs?
Ivan

1
Oui, c'est uniquement local.
Mescalito

1
Cette réponse m'amène à la fonction git dont j'avais personnellement besoin, qui était d'éviter de suivre mes modifications locales dans un fichier de paramètres stocké dans le référentiel distant. La commande que j'ai fini par utiliser étaitgit update-index --skip-worktree filename
dwllama

42

.gitignore ignorera uniquement les fichiers que vous n'avez pas encore ajoutés à votre référentiel.

Si vous avez fait un git add .et que le fichier a été ajouté à l'index, .gitignore ne vous aidera pas. Vous devrez faire git rm sites/default/settings.phppour le supprimer, puis il sera ignoré.


merci, mais comment supprimer le fichier uniquement de l'index et non du répertoire de travail?
Nick.h

1
git rmdevrait faire cela, mais il peut vous demander d'utiliser l'option -f qui le supprimerait du répertoire de travail. Je n'ai pas compris cela à part faire une copie du fichier, faire git rm -fpuis restaurer la copie.
jonescb

Même homme. Faites une copie quelque part, supprimez-la, validez l'état supprimé, ajoutez à nouveau les fichiers et voyez comment ils sont maintenant ignorés.
Yevgeniy Afanasyev

19

Veuillez utiliser cette commande

git rm -rf --cached .
git add .

Parfois, les fichiers .gitignore ne fonctionnent pas même s'ils sont corrects. La raison pour laquelle Git ignore les fichiers est qu'ils ne sont pas ajoutés au référentiel. Si vous avez ajouté un fichier que vous souhaitez ignorer auparavant, il sera suivi par Git et toute règle de correspondance ignorée sera ignorée. Git fait cela car le fichier fait déjà partie du référentiel.


12

J'ai eu le même problème. Les fichiers définis dans .gitingoreoù sont répertoriés comme fichiers non suivis lors de l'exécution git status.

La raison en était que le .gitignorefichier était enregistré en UTF-16LEencodage et non en UTF8encodage.

Après avoir changé l'encodage du .gitignorefichier, UTF8cela a fonctionné pour moi.


Je me sens comme un noob à cause de ça ... dang it Windows
Coty Embry

Une idée de l'importance de l'encodage des fichiers? Peut-être ne pas lire correctement le chemin?
Chargnn

3

Il existe des instances, par exemple des fichiers de configuration d'application, que je souhaite suivre dans git (donc .gitignore ne fonctionnera pas), mais que je dois modifier pour les paramètres locaux. Je ne veux pas que git gère ces fichiers ou les affiche comme modifiés. Pour ce faire, j'utilise skip-worktree:

git update-index --skip-worktree path/to/file

Vous pouvez confirmer que les fichiers sont ignorés en répertoriant les fichiers et en vérifiant les lignes commençant par S pour ignorer

git ls-files -v | grep ^S

Si à l'avenir vous souhaitez que git gère à nouveau le fichier localement, exécutez simplement:

 git update-index --no-skip-worktree path/to/file

Mescalito ci-dessus avait une excellente réponse, qui m'a conduit sur la bonne voie mais

git update-index --assume-unchanged file / vers / ignore.php

A un contrat avec git dans lequel: l'utilisateur promet de ne pas changer le fichier et permet à Git de supposer que le fichier de l'arbre de travail correspond à ce qui est enregistré dans l'index.

Cependant, je change le contenu des fichiers, donc dans mon cas --skip-worktree est la meilleure option.

Le site Web de Toshiharu Nishina a fourni une excellente explication de skip-worktree vs assume-inchangé: ignorer les fichiers déjà gérés avec Git localement


2

Ce que j'ai fait pour ignorer le fichier settings.php avec succès:

  1. git rm - sites mis en cache / default / settings.php
  2. commit (jusqu'ici n'a pas fonctionné)
  3. sites / default / settings.php supprimés manuellement (cela a fait l'affaire)
  4. git add.
  5. commit (ignoré avec succès)

Je pense que s'il y a le fichier commis sur Git, ignorer ne fonctionne pas comme prévu. Supprimez simplement le fichier et validez. Ensuite, il ignorera.


2

Une autre raison possible - quelques instances de clients git s'exécutant en même temps . Par exemple "git shell" + "GitHub Desktop", etc.


Cela m'est arrivé, j'utilisais "GitHub Desktop" comme client principal et il ignorait certains nouveaux paramètres .gitignore: commit après commit:

  1. Vous commettez quelque chose.
  2. Ensuite, validez: il ignore les paramètres .gitignore. Commit comprend de nombreux fichiers temporaires mentionnés dans le .gitignore.
  3. Effacer le cache git; vérifiez si .gitignore est UTF8; supprimer des fichiers -> commit -> déplacer les fichiers en arrière; sauter 1 commit - rien n'a aidé.

Raison : l'éditeur Visual Studio Code fonctionnait en arrière-plan avec le même référentiel ouvert. VS Code a un contrôle git intégré, ce qui crée des conflits.

Solution : vérifiez plusieurs clients git cachés et n'utilisez qu'un seul client git à la fois, en particulier lors de la suppression du cache git.


1

Assurez-vous que le .gitignore n'a pas d'extension !! Cela ne peut pas être .gitignore.txt, dans Windows, nommez simplement le fichier .gitignore. et cela fonctionnera.


0

J'ai juste essayé cela avec git 1.7.3.1, et j'ai donné une structure comme:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

repose trouve donc la "racine" mentionnée ci-dessus (je l'appellerais la racine de votre arbre de travail), et .gitignorecontient seulement sites/default/settings.php, l'ignorer fonctionne pour moi (et peu importe si elle .gitignoreest ajoutée au dépôt ou non). Cela correspond-il à la mise en page de votre dépôt? Sinon, qu'est-ce qui diffère?


Oui, c'est exactement le même que le vôtre, mais cela ne fonctionne pas. Tous les autres modèles fonctionnent. Comme je l'ai dit, le problème est sûrement lié au dossier settings.php.
Nick.h

Je pense que c'est une très mauvaise idée de conserver des éléments dans votre référentiel et d'ignorer les modifications qui y sont apportées.
Yevgeniy Afanasyev

@YevgeniyAfanasyev sauf pour des trucs comme la sortie de compilation, les paramètres utilisateur de l'IDE, tous les autres fichiers temporaires générés par votre chaîne d'outils…
Chris F Carroll

Je voulais dire garder commis dans le référentiel, pas seulement les fichiers se trouvant dans le dossier du projet. Pourquoi auriez-vous besoin de fichiers temporaires dans le référentiel?
Yevgeniy Afanasyev

0

Juste au cas où quelqu'un à l'avenir aurait le même problème que moi:

Si vous utilisez le

*
!/**/
!*.*

astuce pour supprimer les fichiers binaires sans extension, assurez-vous que TOUTES les autres lignes gitignore sont CI-DESSOUS. Git lira à partir de .gitignore depuis le haut, donc même si j'avais 'test.go' dans mon gitignore, il était le premier dans le fichier, et est devenu 'non ignoré' après

!*.*

0

J'ai essayé la plupart des commandes ci-dessus sur le terminal VS Code et j'ai eu des erreurs comme:

fatal: pathspec '[dir]/[file]' did not match any files

J'ai ouvert le projet sur GitHub Desktop et je l'ai ignoré à partir de là et cela a fonctionné.


0

Une chose qui, je pense, a été manquée dans les excellentes réponses ici est l'existence si another *.gitignore* or multiple of them.

Dans un cas, j'avais cloné un dépôt et je ne pouvais pas comprendre pourquoi un fichier "ignoré" était à nouveau ajouté lors de l'exécution de git add . Il s'est avéré qu'il y avait un autre .gitignore dans un sous-dossier et qui remplaçait celui du dossier racine.

/.gitignore
/some-folder/.gitignore
/some-folder/this-file-keeps-getting-staged

le

root /.gitignore

ignorait ce-fichier-continue-d'être mis en scène

le

/some-folder/.gitignore

n'avait pas de spécification pour ignorer le fichier "ce-fichier-continue-à-être".

Et d'où le problème.

L'une des choses est de simplement rechercher plusieurs fichiers .gitignore dans la hiérarchie. Et déterminez les règles telles qu'elles s'appliquent.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.