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?

crise circulaire
la source
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.

Skilldrick
la source
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
Matiss
la source
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 .

Nils Riedemann
la source
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
19

Pour exclure tout dans un répertoire, mais certains sous-répertoires, procédez comme suit:

wp-content/*
!wp-content/plugins/
!wp-content/themes/

Source: https://gist.github.com/444295

Simon Paarlberg
la source
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.
Robert Munteanu
la source
5

!foo.dll dans .gitignore, ou (à chaque fois!) git add -f foo.dll

Tobias Kienzler
la source
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.

DeanOC
la source
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
    
Rosberg Linhares
la source
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

Erfan
la source
1
est-ce que cela fonctionne pour quelqu'un? ne semble pas fonctionner pour moi.
Ankur