2010-05-12 13 views
59

J'essaie d'utiliser un fichier .gitignore avec des motifs niés (lignes commençant par!), Mais cela ne fonctionne pas comme je le souhaitais.Comment les modèles niés fonctionnent-ils dans .gitignore?

Comme exemple minimal, j'ai la structure de répertoire folllowing:

C:/gittest 
-- .gitignore 
-- aaa/ 
    -- bbb/ 
    -- file.txt 
    -- ccc/ 
    -- otherfile.txt 

et dans mon dossier de gitignore, j'ai ceci:

aaa/ 
!aaa/ccc/ 

Ma compréhension (basée sur this doc page) est que la le fichier aaa/ccc/otherfile.txt ne devrait pas être ignoré, mais en fait git ignore tout sous aaa. Ai-je mal compris cette phrase: "Un préfixe facultatif qui annule le motif, tout fichier correspondant exclu par un motif précédent sera à nouveau inclus."?

BTW, c'est sur Windows avec msysgit 1.7.0.2.

Répondre

104

Je pense que ce que vous voulez vraiment faire est:

aaa/* 
!aaa/ccc 

Vous dites qu'il « ne regarde pas dans aaa » il n'examine même le chemin aaa/ccc. Si vous utilisez le caractère générique, il lit encore le contenu de aaa, chaque entrée correspond au caractère générique et est ignoré, sauf aaa/ccc qui obtient mis avant.

+2

qui n'a pas fonctionné pour moi .... – iconoclast

+2

@iconoclast: Alors vous faites probablement quelque chose de différent. Postez une autre question (avec des informations complètes) si vous voulez de l'aide. – Cascabel

+0

Cela n'a pas fonctionné pour moi non plus: /apps/* !/Apps/myApps/FluidTest/bin/ –

10

Si vous voulez exclure tout en aaa, mais inclure aaa/ccc et tout dessous, vous devez utiliser:

aaa/* 
!aaa/ccc 
!aaa/ccc/* 

la première ligne indique git d'ignorer everthing sous aaa, le second dit qu'il ne pas ignorer le dossier aaa/ccc qui fait « permet » la troisième ligne qui indique alors il ne pas ignorer tout sous aaa/ccc.

+1

La troisième ligne n'a fait aucune différence pour moi. –

+1

Pour pouvoir tout inclure dans n'importe quel sous-répertoire de 'aaa/ccc' à n'importe quel niveau, ce qui a fonctionné pour moi était'! Aaa/ccc/** 'au lieu de'! Aaa/ccc/* ' – boclodoa

1

Si quelqu'un ne voit toujours pas les éléments nouvellement ignorés dans un git status exécutant un git update-index avant main peut aider git à voir les changements (au moins dans la version 1.9.x de gitbash).