git ignore exception


326

J'ai un fichier gitignore qui fait que git ignore les *.dllfichiers, et c'est en fait le comportement que je veux. Cependant, si je veux une exception (c'est-à-dire pouvoir s'engager foo.dll), comment puis-je y parvenir?


8
doublon possible des exceptions dans .gitignore
wallyk

fwiw, le grand-père des réponses en double sur ce sujet - une que vous devriez regarder - serait probablement Faire ignorer tout à .gitignore sauf quelques fichiers - une activité très régulière et plusieurs bonnes réponses. Je suis particulièrement fan de cette réponse , qui semble claire et approfondie.
Kay V

Réponses:


447

Utilisation:

*.dll    #Exclude all dlls
!foo.dll #Except for foo.dll

De gitignore :

Un préfixe optionnel! ce qui annule le motif; tout fichier correspondant exclu par un modèle précédent sera à nouveau inclus. Si un modèle annulé correspond, cela remplacera les sources de modèles de priorité inférieure.


22
Voir aussi le formulaire de réponse @Matiss Jurgelis - c'est un ajout important
Dan

7
Puis-je ajouter l'exception au gitignore de mon projet et non à mon gitignore global? Par exemple, si je voulais inclure toutes les DLL dans un répertoire? Mon gitignore_global en contient *.dll, et le gitignore de mon projet en a !Libs/*.dllmais cela ne semble pas fonctionner.
Joel Kinzel

1
@jkinz, vous devriez essayer !Libs/**/*.dll.
Rosberg Linhares

@RosbergLinhares Ou !**/Libs/*.dll, selon la structure des dossiers.
JAB

2
Merci, mais sur un Mac, l'ajout du commentaire sur la même ligne que !foo.dllla commande a invalidé la commande. Si j'ajoute le commentaire sur une ligne séparée, cela fonctionne.
Giacomo

261

Git ignore les dossiers si vous écrivez:

/js

mais il ne peut pas ajouter d'exceptions si vous le faites: !/js/jqueryou !/js/jquery/ou!/js/jquery/*

Vous devez écrire:

/js/* 

et seulement alors vous pouvez exclure des sous-dossiers comme celui-ci

!/js/jquery

44
C'est très important. Je vous remercie!
VisioN du

3
Cependant, il semble que vous ne pouvez pas ajouter de dossiers imbriqués, par exemple !/js/jquery/xyzlib, ne sera pas ignoré ...
Ignorant

2
Comme le dit @Ignorant, le dossier que vous "sauf" de la règle ignorer, doit être au même endroit que le "*"
The Red Pea

3
donc /js/*, !/js/jquery, /js/jquery/*, !/js/jquery/xyzlib? C'est une façon plutôt drôle de le faire ...
Imperishable Night

tu m'as vraiment aidé.
Loyea

55

Vous pouvez simplement git add -f path/to/foo.dll.

.gitignore ignore uniquement les fichiers pour le suivi habituel et des trucs comme git add .


4
Juste pour plus de détails, le -fgit indique de forcer l'ajout de ce fichier dans le référentiel car il pourrait l'ignorer en premier à cause de votre.gitignore
RPDeshaies

Ce qui est génial si vous n'avez qu'un seul fichier, moins utile si vous avez besoin d'un modèle
Liam


15

Ajoutez juste !avant une règle d'exclusion.

Selon la page de manuel de gitignore :

Les motifs ont le format suivant:

...

  • Un préfixe optionnel! ce qui annule le motif; tout fichier correspondant exclu par un modèle précédent sera à nouveau inclus. Si un modèle annulé correspond, cela remplacera les sources de modèles de priorité inférieure.


4

Si vous travaillez avec Visual Studio et que votre fichier .dll se trouve dans un bindossier, vous devrez ajouter une exception pour le dossier bin particulier lui-même, avant de pouvoir ajouter l'exception pour le fichier .dll. Par exemple

!SourceCode/Solution/Project/bin
!SourceCode/Solution/Project/bin/My.dll

Cela est dû au fait que le .gitignorefichier Visual Studio par défaut inclut un modèle d'ignorance pour[Bbin]/

Ce modèle zappe tous les dossiers bin (et par conséquent leur contenu), ce qui rend toute tentative d'inclure le contenu redondant (car le dossier lui-même est déjà ignoré).

J'ai pu trouver pourquoi mon fichier n'était pas exclu en exécutant

git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll

à partir d'une fenêtre Git Bash. Cela a renvoyé le [Bbin]/modèle.


2

La solution dépend de la relation entre la règle git ignore et la règle d'exception:

  1. Fichiers / Fichiers au même niveau: utilisez la solution @Skilldrick .
  2. Dossiers / Sous-dossiers: utilisez la solution @Matiss Jurgelis .
  3. Fichiers / Fichiers à différents niveaux ou Fichiers / Sous-dossiers: vous pouvez le faire:

    *.suo
    *.user
    *.userosscache
    *.sln.docstates
    
    # ...
    
    # Exceptions for entire subfolders
    !SetupFiles/elasticsearch-5.0.0/**/*
    !SetupFiles/filebeat-5.0.0-windows-x86_64/**/*
    
    # Exceptions for files in different levels
    !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo
    !SetupFiles/logstash-5.0.0/**/*.suo
    

1

Depuis Git 2.7.0, Git prendra en compte les exceptions. D'après les notes de version officielles:

  • Autoriser un "! / Abc / def" ultérieur à remplacer un "/ abc" précédent qui apparaît dans le même fichier .gitignore pour faciliter l'expression "tout dans le répertoire / abc est ignoré, à l'exception de ...".

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt


1
est-ce que cela fonctionne pour quelqu'un? ne semble pas fonctionner pour moi.
Ankur
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.