web-dev-qa-db-fra.com

Comment fonctionnent les modèles niés dans .gitignore?

J'essaie d'utiliser un fichier .gitignore avec des motifs négatifs (lignes commençant par!), Mais cela ne fonctionne pas comme je m'y attendais.

À titre d'exemple minimal, j'ai la structure de répertoires suivante:

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

et dans mon fichier gitignore, j'ai ceci:

aaa/
!aaa/ccc/

Ma compréhension (basée sur cette page doc ) est que le fichier aaa/ccc/otherfile.txt ne doit pas être ignoré, mais en fait git ignore tout sous aaa.

Suis-je en train de mal comprendre cette phrase: "Un préfixe facultatif! Qui annule le modèle; tout fichier correspondant exclu par un modèle précédent sera à nouveau inclus."?

BTW, c'est sur Windows avec msysgit 1.7.0.2.

75
Chris Perkins

Je pense que ce que vous voulez réellement faire, c'est:

aaa/*
!aaa/ccc

Vous lui dites "ne regardez pas dans aaa" pour qu'il n'examine jamais le chemin aaa/ccc. Si vous utilisez le caractère générique, il lit toujours le contenu de aaa, puis chaque entrée correspond au caractère générique et est ignorée, sauf aaa/ccc qui est remis en place.

132
Cascabel

Si vous souhaitez tout exclure dans aaa, mais inclure aaa/ccc et tout ce qui se trouve en dessous, vous devez utiliser:

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

La première ligne indique à git d'ignorer tout sous aaa, la seconde lui dit de ne pas ignorer le dossier aaa/ccc qui "active" la troisième ligne qui lui dit ensuite de ne pas ignorer tout ce qui se trouve sous aaa/ccc.

15
xmak

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

1
alexkb