Comment puis-je empêcher le .gitignore d'apparaître dans la liste des fichiers non suivis?

971

Je viens de faire un git inità la racine de mon nouveau projet.

J'ai ensuite créé un .gitignorefichier.

Maintenant, lorsque je tape git status, le fichier .gitignore apparaît dans la liste des fichiers non suivis. Pourquoi donc?

Jacques René Mesrine
la source
13
git add self && git commit -m "-1 for reverting existential depression" && git remote rm HEAD
Alastair
1
Puis-je ignorer le dossier .git / et le mettre dans ".gitignore"?
Timo
2
Vous pouvez créer un "gitignore" global dans votre dossier personnel sous Linux et le stocker là: git config --global core.excludesfile ~ / .gitignore_global
Timo
14
Je suis venu ici en cherchant how to gitignore .gitinore fileet la question et la réponse acceptée ne sont pas vraiment liées au titre. Le titre pourrait être amélioré.
m.rufca
6
Il existe des cas d'utilisation pour ignorer .gitignore. Le flux de travail de mon équipe m'oblige à modifier un ensemble de fichiers pour mon environnement de développement local, mais ils ne doivent pas être validés. Le flux de travail pourrait être amélioré avec une meilleure architecture, mais il est hors de ma portée. En attendant, faire attention à ces fichiers est un handicap. Je veux donc les gitignore mais uniquement localement, et je ne veux pas risquer d'engager mon .gitignore car il ne doit pas être partagé avec l'équipe.
Mark

Réponses:

959

Le .gitignorefichier doit être dans votre référentiel, il doit donc être ajouté et validé, comme git statussuggéré. Il doit faire partie de l'arborescence du référentiel, afin que les modifications apportées à celui-ci puissent être fusionnées, etc.

Alors, ajoutez-le à votre référentiel, il ne doit pas être ignoré.

Si vous voulez vraiment, vous pouvez ajouter .gitignoreau .gitignorefichier si vous ne voulez pas qu'il soit validé. Cependant, dans ce cas, il est probablement préférable d'ajouter les ignores à .git/info/exclude, un fichier local d'extraction spécial qui fonctionne exactement comme .gitignore mais ne s'affiche pas en "état git" car il se trouve dans le .gitdossier.

Voir aussi https://help.github.com/articles/ignoring-files

August Lilleaas
la source
17
Cela ne devrait-il pas faire partie des métadonnées du référentiel plutôt que d'un fichier suivi?
endolith
13
Les métadonnées du référentiel sont locales au référentiel. Si vous ajoutez un hook de validation à votre référentiel et que quelqu'un clone votre référentiel, il n'obtiendra pas le hook de validation, par exemple.
August Lilleaas
91
@wukong, si vous travaillez en équipe, tout le monde ne devrait-il pas ignorer le même ensemble de fichiers? C'est pourquoi le fichier .gitignore est ajouté au référentiel. Personne ne dit que vous devez le déployer dans le cadre de votre projet.
Ryan Lundy
13
@endolith et wukong Il n'est pas nécessaire que ce soit un fichier dans votre dépôt. Vous pouvez avoir vos paramètres d'ignorer dans de nombreux endroits différents. GitHub a un excellent article à ce sujet help.github.com/ignore-files Vous pouvez avoir des paramètres d'ignorer globaux n'importe où, et vous pouvez avoir des paramètres spécifiques au référentiel dans les métadonnées .git pour le référentiel.
Boushley
6
@ deed02392 En utilisant ces fichiers ignorés, vous devez certainement faire preuve de jugement dans ce que vous y mettez, mais ils ont encore de grandes utilisations. Par exemple, j'utilise Vim et donc dans mon gitignore global j'ai des fichiers * .swp marqués comme ignorés. De cette façon, je n'ai pas à l'ajouter à chacun de mes projets, et les gars qui n'utilisent jamais vim n'ont pas à s'en soucier.
Boushley
282

Si vous souhaitez stocker la liste des fichiers ignorés en dehors de votre arborescence Git, vous pouvez utiliser le fichier .git / info / exclude . Il est appliqué uniquement à votre paiement du repo.

Paweł Hajdan
la source
19
+1, c'est idéal pour les ignorés qui ne sont pas liés au projet, tels que les fichiers de sauvegarde emacs * ~, .DS_Store sous OS X et ainsi de suite.
August Lilleaas
38
@AugustLilleaas Je préfère personnellement mettre ces types de fichiers spécifiques à {editor, platform} ~/.gitignoreafin qu'ils soient ignorés pour tout référentiel sur lequel je travaille.
Michael Mior
22
Une fois qu'un fichier est suivi, vous pouvez utiliser git update-index --assume-unchanged <file>pour arrêter le suivi des modifications sans modifier votre référentiel. Ceci est très utile sur les grands projets partagés où vous devez apporter des modifications locales, mais personne d'autre ne veut voir vos trucs engagés dans le dépôt. Voir blog.pagebakers.nl
Chris Esplin
6
@AugustLilleaas: Gitignore par utilisateur est meilleur pour ce cas d'utilisation.
Escargot mécanique
3
merci pour cette astuce, j'utilise git-svn donc les autres utilisateurs du repo svn sur le serveur ne voudraient pas exactement que .gitignore soit enregistré.
enorl76
74

Vous pouvez en fait mettre une ligne .gitignoredans votre .gitignorefichier. Cela entraînerait l' .gitignoreignorance du fichier par git. Je ne pense pas que ce soit une bonne idée. Je pense que le fichier ignoré devrait être contrôlé et suivi. Je mets juste ça là pour être complet.

1800 INFORMATION
la source
7
A travaillé pour moi! version 1.5.6.5. Je suis également d'accord avec 1800 INFORMATION que ce n'est pas une bonne idée, mais je pense que cela pourrait être correct dans certains contextes (disons que vous utilisez un référentiel git-svn et que vous ne voulez pas que les fichiers git-ish soient envoyés à svn). Le fichier exclut est probablement meilleur.
J.Polfer
4
@ehsanul - le fichier ne doit pas être suivi (vous ne devriez pas l'avoir ajouté ou validé). Vous pouvez le dépister. Ce n'est probablement pas une excellente idée dans un environnement git uniquement, mais si vous utilisez par exemple git comme client intelligent pour un dépôt subversion (sans que les autres le sachent, <rires maniaques>) - une telle astuce est géniale.
Tomasz Gandor
2
@IshanSrivastava Vous avez probablement déjà suivi le fichier. Essayez de courirgit rm --cached .gitignore
Gideon
51

Vous pouvez également avoir un .gitignorefichier git utilisateur global qui s'appliquera automatiquement à tous vos dépôts. Ceci est utile pour les fichiers IDE et éditeur (par exemple swpet les *~fichiers pour Vim). Modifiez l'emplacement des répertoires en fonction de votre système d'exploitation.

  1. Ajoutez à votre ~/.gitconfigfichier:

    [core]
    excludesfile = /home/username/.gitignore
    
  2. Créez un ~/.gitignorefichier avec des modèles de fichiers à ignorer.

  3. Enregistrez vos fichiers de points dans un autre référentiel afin d'avoir une sauvegarde (facultative).

Chaque fois que vous copiez, initiez ou clonez un dépôt, votre fichier gitignore global sera également utilisé.

Alec the Geek
la source
6
Je pense que c'est la meilleure solution pour les situations où vos éditeurs laissent des fichiers temporaires, par exemple. *. Swp (VIM) et ._ * (TM), car il ne serait pas logique d'ajouter continuellement ces règles à chaque dépôt git, et pour forcer d'autres utilisateurs avec des IDE différents à rechercher ces fichiers.
Thomas Hunter II
1
Cela fonctionne avec brio pour les ignorés qui ne doivent être poussés vers aucune branche. Remplacez 'username' par votre nom d'utilisateur réel bien sûr, et n'ajoutez pas une deuxième section [core] à .gitconfig si vous en avez déjà une - placez simplement la ligne excludesfile sous votre section [core] existante.
emery
47

Si quelqu'un a déjà ajouté un .gitignoreà votre référentiel, mais que vous souhaitez y apporter des modifications et ignorer ces modifications, procédez comme suit:

git update-index --assume-unchanged .gitignore

Source .

Leif Gruenwoldt
la source
5
Mauvaise idée, il y a une raison .git/info/excludes.
Arrowmaster
6
Je suppose qu'il y a aussi une raison --assume-unchanged. Pourquoi est-ce meilleur que l'autre?
Leif Gruenwoldt
9
Et btw .git/info/excludesne fonctionne pas si le fichier est déjà suivi.
Leif Gruenwoldt, le
Cela m'a vraiment aidé avec un .gitignore qui était déjà engagé et pour lequel je ne souhaitais pas commettre de changements. J'utilise git 1.7.4.1 à partir du dépôt Ubuntu 11.04 et les pages d'aide l'ajoutent dans update-index. "Cette option peut également être utilisée comme un mécanisme de niveau de fichier grossier pour ignorer les modifications non validées dans les fichiers suivis (semblable à ce que fait .gitignore pour les fichiers non suivis). Git échouera (gracieusement) au cas où il aurait besoin de modifier ce fichier dans l'index par exemple lors de la fusion dans un commit; ainsi, si le fichier supposé non suivi est modifié en amont, vous devrez gérer la situation manuellement. "
YonahW
Je vote pour cette réponse, car en général, vous aurez besoin de cette action pour l'état initial de votre référentiel maître et conserver les avantages de la fonctionnalité git. Il n'y a aucune bonne raison d'ignorer ce fichier (point)
Lazaros Kosmidis
37

Après avoir ajouté .gitignoreet validé le fichier, il n'apparaîtra plus dans la liste des "fichiers non suivis".

git add .gitignore
git commit -m "add .gitignore file"
git status
Greg Hewgill
la source
20

Au cas où quelqu'un d'autre aurait la même douleur que nous. Nous voulions exclure un fichier qui avait déjà été validé.

Ce message était beaucoup plus utile: travailler avec .git / info / exclude trop tard

Plus précisément, ce dont vous avez besoin pour ignorer un fichier est en fait utiliser la commande git remove Voir git rm ( http://www.kernel.org/pub/software/scm/git/docs/git-rm.html )

vous le testez en allant

git rm --dry-run *.log
(si vous dites vouloir exclure tous les fichiers journaux)

cela produira ce qui serait exclu si vous l'exécutiez.

puis

vous l'exécutez en allant

git rm *.log
(ou tout autre chemin / expression de nom de fichier que vous souhaitez)

Ajoutez ensuite une *.logligne à votre .gitignorefichier.

Évoluer
la source
4
Bien sûr, vous voudrez peut-être poursuivre avec l'ajout des modèles pertinents (c'est-à-dire * .log) à votre .gitignore, afin qu'ils ne vous encombrent pas git statuss'ils apparaissent à l'avenir.
Patrick O'Leary
2
Bien que mon problème ne soit pas lié à celui de l'OP: merci de m'avoir fait savoir que j'aurais besoin d'utiliser RM pour "nettoyer" mon référentiel après avoir apporté des modifications à .gitignore (si les fichiers sont déjà comités.) Erreur Noob Je sais, mais c'était le premier endroit où j'ai personnellement vu quelqu'un mentionner cela.
Mike
Merci pour les commentaires. Oui, c'est pourquoi je l'ai écrit, étant venu ici et faisant ensuite le long chemin pour résoudre cela aussi, j'ai pensé qu'il serait bon de l'écrire. :)
Evolve
16

Bien sûr, le fichier .gitignore apparaît sur l'état, car il n'est pas suivi, et git le voit comme un nouveau fichier savoureux à manger!

Cependant, comme .gitignore est un fichier non suivi, c'est un candidat à ignorer par git lorsque vous le mettez dans .gitignore!

Donc, la réponse est simple: il suffit d'ajouter la ligne:

.gitignore # Ignore the hand that feeds!

dans votre fichier .gitignore!

Et, contrairement à la réponse d'Août, je dois dire que ce n'est pas que le fichier .gitignore devrait être dans votre référentiel. Il se trouve que cela peut , ce qui est souvent pratique. Et c'est probablement vrai que c'est la raison pour laquelle .gitignore a été créé comme une alternative à .git / info / exclude, qui n'a pas la possibilité d'être suivi par le référentiel. En tout cas, la façon dont vous utilisez votre fichier .gitignore dépend entièrement de vous.

Pour référence, consultez la page de manuel gitignore (5) sur kernel.org.

chasse
la source
15

L'idée est de mettre des fichiers spécifiques à votre projet dans le .gitignorefichier et (comme déjà mentionné) de l'ajouter au référentiel. Par exemple .pycet.o fichiers, les journaux créés par la suite de tests, certains appareils, etc.

Pour les fichiers que votre propre configuration crée mais qui n'apparaîtront pas nécessairement pour chaque utilisateur (comme les .swpfichiers si vous utilisez vim, les répertoires ecplise cachés et autres), vous devez utiliser .git/info/exclude(comme déjà mentionné).

bayer
la source
14

Tout d'abord, comme beaucoup d'autres l'ont déjà dit, votre .gitignoredevrait être suivi par Git (et ne devrait donc pas être ignoré). Laissez-moi vous expliquer pourquoi.

(TL; DR: validez le .gitignorefichier et utilisez un global.gitignore pour ignorer les fichiers créés par votre IDE ou votre système d'exploitation)

Git est, comme vous le savez probablement déjà, un système de contrôle de version distribué . Cela signifie qu'il vous permet de basculer entre les différentes versions (même si le développement a divergé en différentes branches) et qu'il permet également à plusieurs développeurs de travailler sur le même projet.

Bien que le suivi de votre .gitignoreait également des avantages lorsque vous basculez entre des instantanés, la raison la plus importante pour la valider est que vous souhaiterez partager le fichier avec d'autres développeurs qui travaillent sur le même projet. En validant le fichier dans Git, les autres contributeurs obtiendront automatiquement le .gitignorefichier lorsqu'ils cloneront le référentiel, de sorte qu'ils n'auront pas à s'inquiéter de la validation accidentelle d'un fichier qui ne devrait pas être validé (comme les fichiers journaux, les répertoires de cache, les informations d'identification de la base de données , etc.). Et si à un moment donné le projet .gitignoreest mis à jour, ils peuvent simplement récupérer ces modifications au lieu d'avoir à modifier le fichier manuellement.

Bien sûr, il y aura certains fichiers et dossiers que vous voudrez ignorer, mais qui sont spécifiques à vous et ne s'appliquent pas aux autres développeurs. Cependant, ceux-ci ne devraient pas être dans le projet .gitignore. Il existe deux autres endroits où vous pouvez ignorer les fichiers et les dossiers:

  • Les fichiers et dossiers créés par votre système d'exploitation ou IDE doivent être placés dans un global.gitignore . L'avantage est que cela .gitignores'applique à tous les référentiels de votre ordinateur, vous n'avez donc pas à répéter cette opération pour chaque référentiel. Et il n'est pas partagé avec d'autres développeurs, car ils pourraient utiliser un système d'exploitation et / ou un IDE différent.
  • Les fichiers qui n'appartiennent ni au projet .gitignore, ni au global .gitignore, peuvent être ignorés à l'aide d' exclusions de référentiels explicites dansyour_project_directory/.git/info/exclude . Ce fichier ne sera pas partagé avec d'autres développeurs et est spécifique à ce référentiel unique
Nic Wortel
la source
Belle mention pour le monde.gitignore
Gruber
Je pense qu'après la configuration initiale, le fichier .gitignore doit être ignoré, donc il n'y a pas de changements accidentels. Cela ne signifie pas qu'il ne peut plus être changé, mais il est protégé contre les accidents, en quelque sorte. Les accidents sur ce fichier peuvent créer de la confusion ou même mettre en danger certains travaux, donc "sceller" (en s'ignorant) doit également être envisagé.
Sasa
@Sasa .gitignorene fonctionne que pour ignorer les fichiers qui ne sont pas encore suivis par Git. L'ajout d'un fichier déjà suivi .gitignorene vous empêchera pas de valider les modifications apportées à ce fichier. Même si cela était possible, comment commettriez-vous le changement .gitignorequand il demande à Git de s'ignorer?
Nic Wortel
@Nic - J'ai transmis l'explication détaillée à mon point de vue dans la réponse séparée @ au bas de ce fil.
Sasa
12

Attention au "problème" suivant Parfois, vous voulez ajouter des répertoires mais aucun fichier dans ces répertoires. La solution simple consiste à créer un .gitignore avec le contenu suivant:

*

Cela semble fonctionner correctement jusqu'à ce que vous réalisiez que le répertoire n'a pas été ajouté (comme prévu dans votre référentiel. La raison en est que le .gitignore sera également ignoré, et donc le répertoire est vide. Ainsi, vous devriez faire quelque chose comme ceci :

*
!.gitignore
Labyrinthe
la source
9

Cela semble fonctionner uniquement pour votre répertoire actuel pour pouvoir Gitignorer tous les fichiers du référentiel.

mettre à jour ce fichier

.git/info/exclude 

avec votre joker ou votre nom de fichier

*pyc
*swp
*~
Naskov
la source
5

Si vous avez déjà archivé .gitignore et que vous souhaitez ignorer les modifications apportées à celui-ci, consultez cette réponse :

Essayez d'utiliser cette commande:

git update-index --assume-unchanged FILENAME_TO_IGNORE

Pour l'inverser (si jamais vous souhaitez y apporter des modifications), utilisez:

git update-index --no-assume-unchanged

MISE À JOUR :

Voici comment répertorier les fichiers «supposés inchangés» dans le répertoire actuel:

git ls-files -v | grep -E "^[a-z]"

Comme l' -voption utilisera des lettres minuscules pour les fichiers «supposés inchangés».

Aaron
la source
4

Dans mon cas, je souhaite exclure un fichier existant. Seule la modification de .gitignore ne fonctionne pas. J'ai suivi ces étapes:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a

De cette façon, j'ai nettoyé du cache le fichier que je voulais exclure et après l'avoir ajouté à .gitignore .

Andrea Perdicchia
la source
meilleure solution pour moi. vous pouvez également utiliser git add. en second lieu, après que git commit -m "fixant .gitignore"
brainray
3

Accédez au répertoire de base de votre dépôt git et exécutez la commande suivante:

echo '\\.*' >> .gitignore

Tous les fichiers de points seront ignorés, y compris ce .DS_Store embêtant si vous êtes sur un Mac.

Weffen
la source
4
Je ne ferais pas ça. Il peut y avoir des fichiers dot dont vous avez besoin. Au lieu de cela, je voudrais simplement ajouter .gitignore et .DS_Store littéralement.
Edward Falk
2

Il est tout à fait possible qu'un utilisateur final veuille que Git ignore le fichier ".gitignore" simplement parce que les dossiers spécifiques à l'IDE créés par Eclipse ne sont probablement pas les mêmes que NetBeans ou un autre IDE. Donc, pour garder le code source IDE antagoniste, il est facile d'avoir un git personnalisé ignoré qui n'est pas partagé avec toute l'équipe car les développeurs individuels peuvent utiliser différents IDE.

John Brown
la source
1

.gitignoreconsiste à ignorer les autres fichiers. git concerne les fichiers, il s'agit donc d'ignorer les fichiers. Cependant, comme git fonctionne sur des fichiers, ce fichier doit être là comme mécanisme pour lister les autres noms de fichiers.

Si on l'appelait, .the_list_of_ignored_filescela pourrait être un peu plus évident.

Une analogie est une liste de choses à faire que vous ne voulez PAS faire. À moins que vous ne les listiez quelque part, il y a une sorte de liste de choses à faire que vous ne connaîtrez pas à leur sujet.

Michael Durrant
la source
1

Je pense qu'il y a des situations où ignorer le .gitignore est très utile. Par exemple, lorsque vous avez plusieurs équipes ou une grande équipe travaillant sur la même base de code. Dans ce cas, vous devez avoir certaines conventions, l'une de ces conventions concerne ce qui est ignoré lors du dépôt git. Il s'agit généralement d'ignorer les fichiers et répertoires créés par IDE ou OS, certains journaux générés, etc.

Cependant, il existe une force qui tend à introduire des modifications non conventionnelles au .gitignorefichier. Le .gitignorefichier peut être modifié par une personne irresponsable, par erreur, par un outil utilisé, ou dans un autre cas.

Pour avoir une contre-force à cela, nous pouvons faire comme suit:

  1. Le .gitignore initial doit refléter la convention dans les équipes,
  2. Après avoir été poussé, le .gitignore doit être sécurisé en ajoutant une entrée .gitignore et pousser à nouveau ce changement. Le .gitignorefichier est " scellé " de cette façon.

Le " scellé ".gitignore fichier peut être modifié, juste localement, sans propager ces changeurs aux autres membres de l'équipe. Cependant, si un changement est largement accepté dans toute l'équipe, il est possible de le «desceller», de le changer et de le «sceller» à nouveau. Cela ne peut pas être fait par erreur, uniquement intentionnellement.

Malheureusement, vous ne pouvez pas être protégé à 100% contre la stupidité, mais de cette façon, vous avez fait tout votre possible pour éviter que des choses stupides ne se produisent.

Si vous avez une équipe relativement petite avec de très bons professionnels, cela ne serait pas important, mais même ces gars-là apprécieraient d'avoir une chose de moins à s'inquiéter.

L'utilisation .git/info/excludeest cool quand vous ne pouvez rien faire sur les paramètres d'infrastructure, il suffit de couvrir votre propre ** pour ne pas faire d'erreur.

Du point de vue de ce qui est bien et de ce qui ne va pas, je vote pour avoir l'entrée .gitignore dans le .gitignorefichier, donnant à chacun la liberté de faire localement ce qu'il veut, mais pas d'envahir les autres.

Sasa
la source
0

J'ai trouvé que le meilleur endroit pour configurer un ignorer les .DS_Storefichiers embêtants est dans le .git/info/excludefichier.

IntelliJ semble le faire automatiquement lorsque vous y installez un référentiel git.

Stephen McConnell
la source
1
Le fichier global ignorer de l'utilisateur serait un meilleur endroit pour ignorer .DS_Store
Max Nanasy