Comment dire à Git d'ignorer tout sauf un sous-répertoire?

218

Je veux ignorer tous les fichiers de mon référentiel, à l'exception de ceux qui se trouvent dans le binsous - répertoire. J'ai essayé d'ajouter ce qui suit à mon .gitignore:

*
!bin/*

Cela n'a cependant pas l'effet escompté: j'ai créé un nouveau fichier à l'intérieur de bin/, mais le faire git statusmontre toujours nothing to commit (working directory clean).

Aucune suggestion?

Michael Goerz
la source

Réponses:

273

Cela ignore les fichiers racine et les répertoires racine, puis annule le répertoire racine du bac:

/*
/*/
!/bin/

De cette façon, vous obtenez tout le répertoire bin, y compris les sous-répertoires et leurs fichiers.

Tyler Laing
la source
25
Pour une raison quelconque, cela ne fonctionne pas systématiquement pour moi. J'ai les deux lignes /stuff/et !/stuff/specific/, mais il ignore toujours / stuff / specific /
LB--
1
@ LB-- J'ai eu un problème similaire, et git check-ignore -vm'a dit que c'était à cause de~/.gitignore
gurney alex
@gurneyalex J'ai découvert qu'il se corrige automatiquement si je supprime le dépôt local et le reclonifie, ce doit être un bogue.
LB--
2
Le / * / est-il nécessaire?
Alex Baker
3
Ça n'a pas marché pour moi. J'ai dû ajouter !/bin/à mon .gitignorefichier racine , mais en plus j'ai dû ajouter un /bin/.gitignorefichier avec !*... Faire une seule de ces modifications n'a pas fonctionné. Cela n'a fonctionné qu'après avoir combiné les deux changements.
Felipe Brahm
113

Voici comment ignorer tout sauf un répertoire " MY_SUPER_DUPER_TEMPLATE_directory " dans certains répertoires

Structure: / bitrix / templates / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore
Andrii Tishchenko
la source
1
Cela a fait des merveilles pour ignorer un package de fournisseur de laravel que j'avais modifié! Merci, vous m'avez sauvé beaucoup de maux de tête
Maria Vilaró
Cela devrait être sélectionné comme la meilleure réponse.
Bahman.A
63

Vous devez tout exclure sur le chemin vers les destinations, mais vous devez inclure les destinations:

Remarque: Il s'agit d'un fichier d'exclusion (ie .gitignore) donc la logique est inversée. Ignorer tout, sauf le répertoire tsp, ignorer tout dans le répertoire tsp, sauf le répertoire src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore
nikc
la source
11
+1 pour le principe d'inclure un répertoire, puis, en excluant son contenu, puis, en incluant le sous-répertoire souhaité, etc. J'ai fini par utiliser cette réponse sur mes projets.
John Jesus
40

Le seul problème que vous avez est que le binrépertoire lui-même n'est pas mis en correspondance par le bin/*modèle, donc git n'est même pas regarder dans lebin répertoire.

Il y a deux solutions qui me viennent à l'esprit.

.gitignore :

*
!/bin/
!bin/*

ou

.gitignore :

*
!/bin/

bin/.gitignore :

!*

Je préfère la deuxième solution car la première solution n'arrêtera pas d'ignorer les fichiers du binrépertoire qui se trouvent dans des sous-répertoires qui ne sont pas appelés bin. Cela peut ou non être important dans votre situation.

CB Bailey
la source
2
Ça n'a pas marché pour moi. Je dois avoir un .gitignore comme celui-ci pour le faire fonctionner: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* pas de code de bloc dans les commentaires?
xlttj
1
La réponse de Tyler a une meilleure solution de fichier unique
Yarin
19

Du git doc officiel , l'un des exemples dit:

Exemple pour tout exclure sauf un répertoire spécifique foo / bar (notez le / * - sans la barre oblique, le caractère générique exclurait également tout dans foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Pour une explication sur la barre oblique principale: quand utiliser la barre oblique principale dans gitignore .

solstice333
la source
Merci un million, cela a fonctionné pour moi! Notez aux autres que l'ordre des lignes ici est important, vous ne pouvez pas avoir! / Foo / bar avant / foo / * par exemple.
Iamsodarncool
13

Essayez de suivre la dernière version de GIT.

*
!*/
!/path/to/your/dir/**
Kirby
la source
il devrait en fait être! / path / to / your / dir / ** pour la dernière ligne
faham
@faham, oui, je viens de l'ajouter.
Kirby
11

Je pense qu'une meilleure façon serait d'ancrer chaque motif dans le répertoire git supérieur en commençant le motif par une barre oblique:

/*
!/public_html
!/.gitignore

Au lieu d'ignorer tous les fichiers, il ignorera uniquement les fichiers de niveau supérieur, pas ceux du répertoire que vous ne souhaitez pas ignorer.

Jake
la source
8

Cela .gitignorefonctionne pour moi:

*/
/*
!bin/
Trianam
la source
0

J'ai dû le faire récemment:

*
!sub-dir/
!sub-dir/*

Je ne sais pas pourquoi j'ai besoin de deux lignes pour exclure un dossier, mais c'est ce qui a fonctionné pour moi et les macos.

Henri
la source