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?


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.


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

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

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.


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 .


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/**

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.




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.

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.