.gitignore est ignoré par Git


1514

Mon .gitignorefichier semble être ignoré par Git - le .gitignorefichier peut-il être corrompu? À quel format de fichier, paramètres régionaux ou culture Git s'attend-il?

Mon .gitignore:

# This is a comment
debug.log
nbproject/

Sortie de git status:

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       debug.log
#       nbproject/
nothing added to commit but untracked files present (use "git add" to track)

Je voudrais debug.loget nbproject/ne pas apparaître dans la liste des fichiers non suivis.

Où dois-je commencer à chercher à résoudre ce problème?


56
Assurez-vous que votre .gitignorefichier utilise ANSIou UTF-8encodage. S'il utilise autre chose Unicode BOM, il est possible que Git ne puisse pas lire le fichier.
2017 ADTC

8
@ADTC, c'était exactement le problème sur ma machine (Windows). J'ai utilisé echo "file" > .gitignoredans PowerShell, le fichier avait un encodage UCS-2!
MarioDS

7
git rm --cached debug.log nbproject/
Gayan Weerakutti

4
Pourquoi le premier commentaire ici n'est pas une réponse me dépasse
RedOrav

2
@MattParkins Ah je le vois maintenant, cela me surprend toujours qu'une réponse aussi simple et précise soit enterrée comme un commentaire ou que la réponse réellement acceptée soit là-bas. Merci!
RedOrav

Réponses:


3122

Même si vous n'avez pas suivi les fichiers jusqu'à présent, Git semble être en mesure de "les connaître" même après les avoir ajoutés .gitignore.

AVERTISSEMENT: commencez par valider vos modifications actuelles, sinon vous les perdrez.

Exécutez ensuite les commandes suivantes à partir du dossier supérieur de votre référentiel Git:

git rm -r --cached .
git add .
git commit -m "fixed untracked files"

8
J'ai obtenu "usage: git rm [options] [-] <fichier> ..." imprimé lorsque j'ai essayé "git rm -r --cached". Si cela est important, j'utilise Git depuis PowerShell après avoir cliqué sur "Outils-> Ouvrir un shell ici" dans GitHub pour Windows.
Soonts

61
sous Windows: git rm. -r --cached et git add.
Beachhouse

90
Soyez conscient de valider toutes vos modifications avant, sinon vous perdrez le contrôle de tous les fichiers modifiés !!
Cosmin

45
Les 3 premiers commentateurs semblent avoir raté le point à la fin. Cela signifie chaque fichier. "git -rm -r --cached." <- remarquez le point.
Christophe De Troyer

18
Si vous ne voulez pas vous engager, une solution de contournement consiste à mettre vos modifications sur l'étagère: "git stash". Exécutez les commandes ci-dessus. et lancez "git stash pop"
Ivan Voroshilin

335

S'il semble que Git ne remarque pas les modifications que vous avez apportées à votre .gitignore fichier, vous pouvez vérifier les points suivants:

  • Un .gitignorefichier global peut interférer avec votre fichier local.
  • Lorsque vous ajoutez quelque chose dans un fichier .gitignore, essayez ceci:

    git add [uncommitted changes you want to keep] && git commit
    git rm -r --cached .
    git add .
    git commit -m "fixed untracked files"
    
  • Si vous supprimez quelque chose d'un fichier .gitignore et que les étapes ci-dessus ne fonctionnent peut-être pas, si vous avez constaté que les étapes ci-dessus ne fonctionnent pas, essayez ceci :

    git add -f [files you want to track again]
    git commit -m "Refresh removing files from .gitignore file."
    
    // For example, if you want the .java type file to be tracked again,
    // The command should be:
    //     git add -f *.java
    

3
Peut-être pourriez-vous modifier la réponse de @AlinHuruba pour ajouter votre étape 3?
Benj

@Benj Merci pour vos conseils, je n'ai pas trouvé la réponse d'AlinHuruba, je ne sais pas quelle est la différence, alors dites-le moi directement.
ifeegoo

2
L'étape 3 est ce dont j'avais besoin. La plupart des réponses indiquent simplement comment supprimer le fichier que nous voulons déceler. Merci pour le point de vue opposé.
Yeung

J'espère que cela vous aide!
ifeegoo

7
git rm -r --cached .travaillé pour moi
Jason

198

Fixé. OK, j'ai créé le fichier .gitignore dans le Bloc-notes sur Windows et cela ne fonctionnait pas. Quand j'ai vu le fichier .gitignore sous Linux, il ressemblait à du charabia organisé - peut-être que le Bloc-notes avait écrit Unicode plutôt que ASCII ou quelque chose de 8 bits.

J'ai donc réécrit le fichier sur ma boîte Linux, et quand je l'ai ramené dans Windows, cela fonctionne bien! Hourra!


77
Dans le Bloc-notes, choisissez simplement l'encodage "ANSI" dans la boîte de dialogue "Enregistrer sous". Ou mieux encore, procurez-vous un éditeur de texte approprié - après tout, vous êtes un programmeur :) ... Je peux recommander "Bloc-notes du programmeur", d'autres préfèrent Notepad ++ et il y en a littéralement des centaines d'autres.
0xC0000022L

1
hehe, ouais, j'aurais dû le créer en netbeans (que j'utilisais à l'époque), en éclipse ou en visual studio. Je viens de l'appeler depuis la ligne de commande en pensant que cela ne ferait pas de différence.
Matt Parkins

8
Mon problème était similaire - mon .gitignore utilisait UTF8 avec une nomenclature . Je viens de l'enregistrer au format UTF8 sans nomenclature et cela a commencé comme par magie.
Phil

13
C'était aussi mon problème. J'avais créé le fichier .gitignore avec "echo dirName> .gitignore" car Windows rend la création de fichiers commençant par "." Très pénible. L'encodage du fichier créé de cette façon était illisible par git, et il l'a interprété comme un fichier binaire à la place. Cliquez sur "Encoding -> UTF-8" dans Notepad ++, sauvegardez, c'est fait.
Laura

4
A eu le même problème que @Laura dans PowerShell - le fichier est par défaut enregistré en UTF16.
mrówa

113

Sans ajouter un autre commit à votre projet, une ligne sera suffisante pour faire .gitignorefonctionner comme elle est censée:

git rm -r --cached debug.log nbproject

Cela les supprimera du référentiel, mais les conservera toujours physiquement. En clair, il supprime tout historique des modifications qui leur sont liées et ne suivra pas non plus leur modification lors d'une future validation. Vous pouvez trouver une meilleure explication ici .


1
Fonctionné exactement comme je le souhaitais - je n'avais qu'un seul fichier qui n'était pas correctement suivi. J'ai enregistré son contenu dans le bloc-notes et l'ai fait: git rm -r --cached someFile.phpet cela a fonctionné comme un charme :)
ShayLivyatan

@FMFF Cela le supprimera du référentiel mais les conservera toujours physiquement, en langage clair, il supprimera tout historique des modifications qui leur sont liées, et ne suivra pas non plus leur modification dans un futur commit. Une meilleure explication peut être trouvée ici: stackoverflow.com/questions/37279654/…
H Aßdøµ

J'ai un "fatal: pathspec 'debug.log' ne correspond à aucun fichier"
Michael

45

Une autre cause de ce problème est les espaces vides ou les tabulations avant l'instruction:

Exemple:

# Be aware of the following:
 notWorkingIgnore.*
workingIgnore.*

Et comme le souligne le commentaire ci-dessous, un espace de fin peut également être un problème:

# Be aware of the following:
notWorkingIgnore.* #<-Space
workingIgnore.*#<-Nospace

11
Un espace de fuite était mon problème, ce qui est encore plus difficile à trouver.
amr

3
a également eu un problème d'espace blanc arrière.
Trefex

3
Oui, c'est pareil ici. Je pensais que je pouvais écrire des commentaires après le modèle de fichier: *.txt # Tex files. Mais git comprend: "Ignorez les fichiers avec l'extension txt "
Adam Libuša

3
Ma parole m'a pris 2 jours pour trouver cette réponse de 15 votes positifs. Cela mérite plus.
fordcars

2
Vous venez de résoudre un problème que j'avais depuis des mois ... Merci!
Arkellys

36

J'ai remarqué que l'encodage du .gitignoreavait un effet - si le fichier était Unicode, il était ignoré, s'il était ASCII, ce n'était pas le cas.

Processus:

  1. Vérifiez l'état: PS> git status
  2. Créer une fonction pour Get-FileEncoding
  3. .gitignoreEncodage du test :PS> Get-FileEncoding .gitignore
  4. Changez l'encodage en ASCII:PS> Set-Content .gitignore -Encoding Ascii -Value (Get-Content .gitignore)
  5. Confirmer: PS> git status

5
1000 merci pour cela. Je créais le fichier .gitignore sur mon système à l'aide de la route touch .gitignoreet echo ".db" >> .gitignorevia PowerShell. J'ai trouvé que le echo ".db" >> .gitignore"paramètre d'encodage du fichier était UCS-2 LE-BOM, une conversion rapide en ASCII et le gitignore a commencé à fonctionner.
B-Rad

2
Vous pouvez essayer en sautant les étapes 2 et 3.
Aniket Bhansali

32

Comme pour les autres solutions, engagez-vous d'abord et sachez que vous allez perdre tout changement de l' ONU désengagés.

J'ai eu de meilleurs résultats avec ceci:

git rm -r --cached .
git reset HEAD --hard
git status

Notez que l'état ne devrait pas avoir de fichiers modifiés maintenant.


2
celui-ci ne fonctionne pas pour moi, mais la réponse de ifeegoo le fait
fanny

21

Dans mon cas, c'est parce que les fichiers existent déjà dans le référentiel et j'essaie de l'ignorer.

Voici les choses que j'ai faites pour résoudre le problème:

  • Copiez les fichiers dans un dossier temporaire
  • Supprimez-les de mon dossier de projet.
  • Validez les modifications qui suppriment ces fichiers du référentiel
  • Re-ajouté ces fichiers dans mon dossier de projet

D'ici là, toutes les modifications que j'ai apportées à ces fichiers ont été ignorées.

Je pense que vous ne pouvez pas ignorer les fichiers qui existent déjà sur le référentiel.


Dans mon cas, ils étaient déjà mis en scène. Ce n'est qu'après avoir fait ce que vous suggérez, puis tenté de vous engager et vu l'avertissement qu'ils avaient été mis en scène et supprimés que j'ai réalisé que c'était le problème.
dudeNumber4

19

Toutes les réponses ici sont en fait des solutions de contournement. Vous devez créer le fichier .gitignore avant d'exécuter git init. Sinon git, vous ne saurez jamais que vous devez ignorer ces fichiers, car ils ont déjà été suivis.

echo .idea/ >> .gitignore
git init

Si vous vous développez quotidiennement, je vous conseille d'ajouter vos fichiers habituels ignorés à votre ~/.gitignore_globalfichier. De cette façon, vous gitsaurez déjà quels fichiers vous (c'est-à-dire "votre utilisateur", car c'est un fichier de votre répertoire personnel) ignorez habituellement.


Dieu merci ... enfin une solution qui fonctionne pour moi.
Dbl

~/.gitignore_globalest un nom configurable. Exécutez d' git config --global core.excludesfileabord pour voir si vous avez déjà un fichier défini. Sinon, exécutez git config --global core.excludesfile ~/.gitignore_global.
Noumenon

Une solution de contournement si vous n'avez pas créé en .gitignorepremier: renommez le fichier suivi. .gitignoresera appliqué comme s'il était nouveau.
Noumenon

15

Consultez également le répertoire dans lequel vous l'avez placé .gitignore.

Il doit être à la racine de votre projet :

./myproject/.gitignore

Pas dedans

./myproject/.git/.gitignore

9

Spécifiquement pour les utilisateurs de Windows: Si vous avez des fichiers non suivis et que la suppression / suppression des fichiers mis en cache ne fonctionne pas. Essayez d'ouvrir PowerShell et de convertir le fichier .gitignore en encodage UTF-8:

$Myfile = Get-Content .\.gitignore`
$Myfile | Out-File -Encoding "UTF8" .gitignore

Vous devez effectuer cette opération une seule fois pour encoder le fichier .gitignore de ce répertoire, et puisque le fichier est ensuite encodé correctement, chaque fois que vous éditerez le fichier à l'avenir, cela devrait fonctionner. Je pense que cela est dû à un problème avec GitHub qui n'est pas sur le point de lire le codage non UTF-8 pour un fichier .gitignore. Pour autant que je sache, ce problème n'a pas encore été résolu pour Windows. Ce n'est pas trop grave, juste une douleur à déboguer quand ça ne fonctionne pas.


8

Il peut y avoir un autre problème avec .gitignorecela, en particulier pour un utilisateur Windows. Git n'aime pas ça quand vous nommez .gitignore(commeunity.gitignore ).

Vous voudrez toujours le nommer .gitignore, ou sous Windows, .gitignore.car Windows pense que vous essayez de le renommer sans nom de fichier.


7

Je viens de rencontrer ce problème. Le contenu de mon fichier .gitignore a continué à apparaître dans la liste des fichiers non suivis.

J'utilisais ceci pour créer le fichier ignoré:

echo "node_modules" > .gitignore

Il s'avère que les doubles citations me causaient le problème. J'ai supprimé le fichier ignoré, puis utilisé à nouveau la commande sans guillemets, et cela a fonctionné comme prévu. Je n'avais pas besoin de jouer avec l'encodage des fichiers. Je suis sur une machine Windows 10 utilisant Cmder .

Exemple:

echo node_modules > .gitignore

Bizarre, cette déclaration d'écho a résolu un problème que j'avais localement où un fichier ignoré que j'avais supprimé par accident puis recréé apparaissait comme un fichier validable et non suivi. Pour une raison quelconque, même si cela n'a pas changé mon fichier ignoré, cela a résolu mon problème.
Patrick

6

Pour moi, aucune des réponses précédentes n'a fonctionné. J'ai dû copier du .gitignoretexte dans le exclude.txtfichier trouvé à

<Your-project-folder>\.git\info

Une fois terminé, actualisez vos modifications et tous les fichiers non suivis ont disparu. Engagez-vous comme d'habitude.


6

Mon problème était (comme OP l'a suggéré) un fichier .gitignore corrompu. Je n'ai pas cru que c'était le cas et j'ai ignoré la possibilité jusqu'à ce que tout le reste échoue. La corruption n'est pasvi apparue, mais il y avait deux octets au début du fichier qui ont provoqué l'ignorance du fichier .gitignore. Pour moi, ceux-ci n'apparaissent que lorsque je tape cat .gitignore, ce qui montre:

��# Built application files
*.apk
*.ap_

# ...

Je n'ai aucune idée de la façon dont ceux-ci se sont retrouvés là-bas, mais recréer le fichier a résolu le problème. Une analyse hexadécimale du fichier corrompu a montré ce qui suit:

user@dev ~/project/myproject $ xxd -b .gitignore
00000000: 11111111 11111110 00100011 00000000 00100000 00000000  ..#. .
00000006: 01000010 00000000 01110101 00000000 01101001 00000000  B.u.i.

2
Cela ressemble à une marque d'ordre d'octets UTF-16 dans un fichier encodé UTF-8. en.wikipedia.org/wiki/Byte_order_mark
jsageryd

6

J'ai eu ce problème, avec un fichier .gitignore contenant cette ligne:

lib/ext/

Je viens de réaliser qu'en fait, ce répertoire est un lien symbolique vers un dossier ailleurs:

ls -la lib/ext/
lrwxr-xr-x 1 roipoussiere users 47 Feb  6 14:16 lib/ext -> /home/roipoussiere/real/path/to/the/lib

Sur la ligne lib/ext/, Git recherche en fait un dossier , mais un lien symbolique est un fichier , donc mon libdossier n'est pas ignoré.

J'ai corrigé cela en remplaçant lib/ext/par lib/extdans mon fichier .gitignore.


5

J'ai eu le même problème. Je crois que le problème était un écart CR vs CR + LF. J'ai caché des choses dans mon .gitignore en utilisant CMD (sur Windows 7) et la commande suivante:

Mauvais:

echo "file_to_be_ignored.py" >> .gitignore<br>
echo "*~" >> .gitignore

Etc.

Le problème était que cette commande ne place pas le marqueur de fin de ligne correct pour que Git reconnaisse les nouvelles lignes (CR ou CR + LF lorsque Git attend l'autre). J'ai résolu le problème en remplaçant manuellement chaque nouvelle ligne dans Vim (Vim à la rescousse!) Et cela a parfaitement fonctionné.

Essayez de modifier votre .gitignore dans Notepad ++ ou Vim (idéalement). Même si le fichier semble être correctement formaté, essayez de remplacer les retours à la ligne. Cela semble bizarre, je sais, mais cela a fonctionné pour moi. :RÉ



3

Une chose à regarder également: Enregistrez-vous votre fichier .gitignore avec les fins de ligne correctes?

Les fenêtres:

Si vous l'utilisez sous Windows, l'enregistrez-vous avec des fins de ligne Windows? Tous les programmes ne le feront pas par défaut; Notepad ++ et de nombreux éditeurs PHP utilisent par défaut les fins de ligne Linux afin que les fichiers soient compatibles avec le serveur. Une façon simple de vérifier cela est d'ouvrir le fichier dans le Bloc-notes Windows. Si tout apparaît sur une seule ligne, le fichier a été enregistré avec les fins de ligne Linux.

Linux:

Si vous rencontrez des problèmes avec le fichier fonctionnant dans un environnement Linux, ouvrez le fichier dans un éditeur tel qu'Emacs ou nano . Si vous voyez des caractères non imprimables, le fichier a été enregistré avec des fins de ligne Windows.


3

Une autre raison possible - quelques instances de clients Git fonctionnant 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 inclut de nombreux fichiers temporaires mentionnés dans le .gitignore.
  3. Vider le cache Git; vérifiez si .gitignore est UTF-8; supprimer des fichiers → valider → déplacer des fichiers en arrière; sauter un commit - rien n'y fait.

Raison : l'éditeur de code Visual Studio s'exécutait en arrière-plan avec le même référentiel ouvert. Visual Studio Code a un contrôle Git intégré, ce qui crée certains conflits.

Solution : vérifiez plusieurs clients Git cachés et utilisez un seul client Git à la fois, en particulier lors de l'effacement du cache Git.


3

Il y a déjà de bonnes réponses, mais ma situation était fastidieuse. J'avais édité la source d'un logiciel PLM (gestion du cycle de vie des produits) installé sur Win10 et décidé ensuite: "J'aurais probablement dû en faire un dépôt git."

Ainsi, l'option de cache ne fonctionnera pas directement pour moi. Publier pour d'autres personnes qui peuvent avoir ajouté le contrôle des sources APRÈS avoir fait un tas de travail initial ET .gitignorene fonctionne pas MAIS, vous pourriez avoir peur de perdre un tas de travail, donc ce git rm --cachedn'est pas pour vous.

!IMPORTANT: C'est vraiment parce que j'ai ajouté git trop tard à un "projet" trop gros et qui semble ignorer mon .gitignore. Je n'ai AUCUN engagement, jamais. Je peux git loin avec ça :)

Tout d'abord, je viens de faire:

rm -rf .git
rm -rf .gitignore

Ensuite, je devais avoir une photo de mes changements. Encore une fois, c'est un produit d'installation sur lequel j'ai apporté des modifications. Trop tard pour un premier commit de pure master branch. Donc, j'avais besoin d'une liste de ce que j'avais changé depuis que j'avais installé le programme en ajoutant > changed.logà l'un des éléments suivants:

PowerShell

# Get files modified since date.
Get-ChildItem -Path path\to\installed\software\ -Recurse -File | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-02-25')} | Select-Object FullName

Frapper

# Get files modified in the last 10 days...
find ./ -type f -mtime -10

Maintenant, j'ai ma liste de ce que j'ai changé au cours des dix derniers jours (n'entrons pas dans les meilleures pratiques ici sinon pour dire, oui, je me suis fait ça).

Pour un nouveau départ, maintenant:

git init .
# Create and edit .gitignore

J'ai dû comparer ma liste modifiée à mon .gitignore grandissant, en cours d'exécution git status d' fur et mesure que je l'améliorais, mais mes modifications dans .gitignore sont lues au fur et à mesure.

Enfin, j'ai la liste des changements souhaités! Dans mon cas, c'est passe-partout - certains thèmes fonctionnent avec plusieurs configurations XML spécifiques à l'exécution d'un système de développement contre ce logiciel que je veux mettre en dépôt pour que d'autres développeurs saisissent et contribuent ... Ce sera notre branche principale, donc s'engager, pousser et enfin BRANCHER pour de nouveaux travaux!


2

Supprimez simplement le dossier ou le fichier, qui a été validé précédemment dans Git, par la commande suivante. Ensuite, le fichier gitignore reflétera les fichiers corrects.

    git rm -r -f "folder or files insides"

2

Une chose délicate non couverte par les autres réponses ici est que le fichier .gitignore ne fonctionnera pas si vous avez des commentaires en ligne, comme ceci:

foo/bar # The bar file contains sensitive data so we don't want to make this public

Donc, si vous avez des commentaires comme ça, changez-les comme ceci:

# The bar file contains sensitive data so we don't want to make this public
foo/bar

2

Il est également possible que vous ayez modifié le .gitignorefichier avec une sudocommande. J'ai rencontré le même problème et lors de l'exécution des commandes:, git statusje pouvais toujours voir les fichiers "devrait être ignoré".

Lors de l'édition avec nano .gitignoreau lieu de sudo nano .gitignore, j'ai pu voir le reflet correct.


2

J'ai créé .gitignore à l'aide echo "..." > .gitignorede PowerShell dans Windows, car il ne me permet pas de le créer dans l'Explorateur Windows.

Le problème dans mon cas était l'encodage du fichier créé, et le problème a été résolu après l'avoir changé en ANSI.


2

Moi aussi j'ai le même problème sur Ubuntu, j'ai créé le .gitignoredepuis le terminal et ça marche pour moi

touch .gitignore


2

Le mien ne fonctionnait pas parce que j'ai littéralement créé un document texte appelé .gitignore

Au lieu de cela, créez un document texte, ouvrez-le dans le Bloc-notes ++, puis enregistrez-le au format .gitignore

Assurez-vous de sélectionner Tous les types (*. *) Dans la liste déroulante lorsque vous l'enregistrez.


Ou dans gitbash, utilisez simplement touch .gitignore


1

Si vous êtes un utilisateur Notepad ++ , essayez de procéder comme suit:

Ouvrez votre fichier .gitignore à l'aide de Notepad ++ et faites:

Menu ÉditionConversion EOLFormat WindowsEnregistrer .

Essayez d'utiliser à git statusnouveau et voyez si cela fonctionne pour vous.

J'ai posté la réponse à une question similaire ici .


1

Pour moi, c'était encore un autre problème. Mon fichier .gitignore est configuré pour ignorer tout sauf les choses que je lui dis de ne pas ignorer. Comme tel:

/*
!/content/

Maintenant, cela signifie évidemment que je dis également à Git d'ignorer le fichier .gitignore lui-même. Ce qui n'était pas un problème tant que je ne suivais pas le fichier .gitignore. Mais à un moment donné, j'ai commis le fichier .gitignore lui-même. Cela a ensuite conduit à ignorer correctement le fichier .gitignore.

Donc, l'ajout d'une ligne supplémentaire l'a corrigé:

/*
!/content/
!.gitignore

1

Mon problème est que j'ai noté les fichiers à ignorer avec des guillemets "" et non avec une barre oblique /.

Cela n'a pas fonctionné et a été ignoré par git:

"db.sqlite3"
"tdd_venv/"

Cela a très bien fonctionné:

/db.sqlite3
/tdd_venv/

J'ai également vérifié l'encodage de mon fichier dans Windows avec Notepad ++. Le codage a été défini sur UTF-8.

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.