gitignore n'ignore pas le dossier

135

À la racine de mon projet, j'ai un foodossier. Dans le foodossier, j'ai un bardossier. Je souhaite ignorer toutes les modifications apportées à tous les fichiers de mon bardossier. J'ai ceci dans mon gitignore:

/foo/bar

Le dossier est vérifié: il existe et il contient les fichiers à ignorer. gitignoreest committed. Cependant, j'ai un fichier dans lequel je fais une moification et se trouve dans mon bardossier. Quand je tape

git status

dans mon git bashje vois le fichier qui aurait dû être ignoré. Quelle pourrait être la raison et comment puis-je ignorer avec succès tous les fichiers dans mon dossier de barre?

Notez que les fichiers étaient auparavant ignorés avec la même ligne, mais j'ai dû temporairement supprimer cette ligne vers commitquelque chose sur le serveur. Après le commit, je remets la ligne dans le gitignore. C'était il y a quelque temps, mais maintenant, j'ai observé que les fichiers seront au format git status. Je m'attendrais à pouvoir modifier les fichiers ignorés sans qu'ils n'apparaissent dans le fichier git status.

Lajos Arpad
la source
À l'avenir, vous n'aurez pas besoin de modifier vos ignorés pour ajouter quelque chose d'ignoré. git add -f ignored-fileajoutera un fichier même s'il est dans vos ignorés.
Chris
Qu'est-ce que ça git status foo/bar/file-that-should-be-ignoreddonne?
Chris
Le fichier qui doit être ignoré en cas de modification. Il me manque évidemment quelque chose, mais selon ma connaissance, la liste des statuts git devrait être vide dans ce cas à condition que / foo / bar soit présent dans .gitignore
Lajos Arpad
4
On dirait que ce fichier est en fait suivi par Git. Il doit avoir été ajouté au référentiel à un moment donné. Vous pouvez voir son histoire avec git log foo/bar/file-that-should-be-ignored. S'il ne fait pas partie du référentiel, vous devez le supprimer avec git rm --cached foo/bar/file-that-should-be-ignored, puis le valider comme suggéré par Reck ci-dessous (bien que je le fasse simplement sur le fichier, pas sur le dossier entier). Cela (a) supprimera le fichier de Git, (b) conservera le fichier dans votre copie locale, et (c) provoquera la suppression du fichier lorsque d'autres fetchou pullle nouveau commit.
Chris
1
Double possible des fichiers Ignorer qui ont déjà été
validés

Réponses:

341

Je suppose que ce dossier a déjà été vérifié dans git?

Exécutez git rm -r --cached <folder>et vérifiez à nouveau.

Reck
la source
3
Cela supprimera complètement le dossier du (version actuelle du) dépôt. OP veut que le dossier soit là, mais les nouvelles modifications ne doivent pas être suivies
Gareth
Malheureusement, je dois supprimer l'acceptation. Cette solution a supprimé les versions distantes des fichiers une fois poussées. Je veux configurer gitignore pour ignorer tous les fichiers d'un dossier, pas pour le supprimer de la télécommande. Est-ce possible? J'ai inversé la solution.
Lajos Arpad
12
git update-index --assume-unchanged <folder>peut-être?
Reck
3
@Lajos n'auriez-vous pas dû corriger son bug au lieu d'ajouter ce commentaire déroutant "edit" ici?
cregox
2
@Cawas, comme ce site concerne le partage des connaissances, la réponse est: non. Il est trompeur d'accepter une réponse contenant un bogue. Ce -r n'est pas facultatif.
Lajos Arpad
46

Pour moi, la réponse acceptée faisait partie de la solution, pas la solution entière. Peut-être que les autres étapes que je suis sur le point de publier étaient évidentes, mais je les ai manquées en premier. Voici les étapes que j'ai suivies pour m'assurer que mon .gitignorefichier ignore le dossier que je voulais qu'il ignore:

  1. Validez toutes les modifications que vous devez corriger / modifier.
  2. Exécutez cette commande: git rm -r --cached .(qui supprime tout de l'index git afin de rafraîchir votre référentiel git)
  3. Ensuite, exécutez cette commande: git add .(pour tout ajouter au référentiel)
  4. Enfin, validez ces modifications en utilisant git commit -m ".gitignore Fixed"

Vous pouvez trouver le lien vers l'article d'où j'ai trouvé la solution ici .

sikanderBabwani
la source
1
Ce n'est pas une solution viable basée sur la question initiale. @ lagos-arpad a spécifiquement posé des questions sur un sous-répertoire et non sur l'ensemble du projet. Votre solution supprime tout du niveau racine du référentiel git et ce n'est pas une approche recommandée pour résoudre ce problème.
justinhartman
Même si ce n'est qu'un sous-répertoire, cette solution a fonctionné pour moi car je ne traitais qu'un seul fichier. Pouvez-vous expliquer pourquoi ce n'est pas recommandé?
sikanderBabwani
1
Ce à quoi vous avez affaire est sans importance. Ce n'est pas la réponse à la question et est potentiellement dangereux comme l'autre réponse l'a souligné. Cela supprime les éléments du référentiel distant dont vous ne voulez pas nécessairement.
RichieHH
8

J'avais ce problème et j'ai réalisé que git ignorait en fait correctement les fichiers / dossiers, mais mon éditeur de code (Visual Studio Code) était juste bogué et ne les "grisait pas" correctement dans la barre latérale de l'interface utilisateur. J'ai redémarré VSCode et ils étaient grisés comme prévu.

Mark Jackson
la source
Idem ici: VS Code v1.30.2 (utilisateur)
xinthose
Pareil pour moi. Merci beaucoup pour cette solution! Je me demandais pourquoi mon .gitignore ne fonctionnait pas avant d'essayer de redémarrer VS Code. Je suis sur Visual Studio Code v1.44.2.
Fritz Lim
6

En complément de la réponse acceptée

git rm -r --cached /foo/bar/
git status

Quand je fais cela, le terminal affiche un tas de rm fichiers pour dans ce répertoire. Donc, pour éviter un autre commit qui pourrait affecter inutilement la télécommande, j'ai fait:

git reset HEAD *
git status

Après cela, il ne dit rien de s'engager et lorsque je modifie des fichiers à l'intérieur /foo/bar/et que git statusje fais toujours un, je reçois toujours nothing to commit.

apprend plus
la source
1
Cela me ramène à mon point de départ (le problème)
Shonubi Korede