Comment ajouter des fichiers sans points (tous les fichiers sans extension) au fichier gitignore?

111

Comme le titre l'indique, est-il possible d'ajouter des "fichiers sans points" au fichier gitignore?

J'imagine que cela prendrait soin de tous ces fichiers sans extension gênants.

Le chat impertinent
la source
2
Il y a quelques fichiers que vous ne sans extension voulez pas ignorer: README, LICENSEou COPYING, INSTALL, Makefileetc., mais vous pouvez toujours forcer- les ajouter et puis ils sont suivis
Jakub Narębski
@ JakubNarębski bon point. Je l'ai inclus dans ma réponse pour plus de visibilité.
VonC le
duplication possible de gitignore sans fichiers binaires
Mad Physicist

Réponses:

121

Vous pouvez essayer une combinaison similaire à:

*
!/**/
!*.*

Cette gitignorerègle d'exclusion (un modèle annulé ) doit ignorer tous les fichiers, à l'exception de ceux avec une extension.

Comme mentionné ci - dessous par Mad Physicist , la règle est:

Il n'est pas possible de ré-inclure un fichier si un répertoire parent de ce fichier est exclu. (*)
(*: sauf si certaines conditions sont remplies dans git 2.?+, voir ci-dessous)

C'est pourquoi il !/**/est important (lister en blanc les dossiers parents de manière récursive) si nous voulons mettre en liste blanche les fichiers.

J'ai mentionné cette même règle dans des cas similaires comme:


Comme le fait remarquer Jakub Narębski , vous ne voudrez peut-être pas ignorer tous les fichiers sans extension.

Mon conseil:

  • ajoutez d'abord le fichier sans extension qui compte
  • puis éditez votre .gitignorecomme indiqué ci-dessus: les fichiers déjà versionnés ne seront pas ignorés (même s'ils n'ont pas d'extension). Tous les autres seront ignorés.

Pour tous les futurs fichiers sans extension que vous souhaitez version:

git add -f -- myFile

Notez qu'avec git 2.9.x / 2.10 (mi-2016?), Il peut être possible de ré-inclure un fichier si un répertoire parent de ce fichier est exclu s'il n'y a pas de caractère générique dans le chemin ré-inclus .

Nguyễn Thái Ngọc Duy ( pclouds) essaie d'ajouter cette fonctionnalité:

Cependant, l'une des règles de la réinsertion étant:

La partie répertoire dans les règles de ré-inclusion doit être littérale (c'est-à-dire pas de caractères génériques)

Cela n'aurait pas fonctionné ici de toute façon.

VonC
la source
1
La réponse est tout à fait correcte. Mais peut-être mieux .gitignoreserait **et !**.*. Je sais que cela ne fait aucune différence si l'astérisque est placé devant, mais c'est plus explicite et sonore avec la façon dont les shells gèrent les jokers ...
Willem Van Onsem
7
Remarque: pour travailler avec d'autres règles d'exclusion, il faudra que ce soit le premier ensemble de règles dans votre fichier .gitignore
Erik
Vous pouvez également réintégrer certains fichiers sans extension, par exemple avec !Makefile. Attention, j'ai rencontré des problèmes avec cette solution dans Git 1.7.1 alors qu'elle fonctionnait bien dans 1.9.0. Dans mon cas, l'ajout d'un fichier dans le répertoire racine fonctionnait bien, mais l'ajout d'un fichier avec une extension dans un sous-répertoire était affiché comme ignoré. Cela semble être dû au fait que 1.7.1 ne supportait pas **encore le modèle, voir ici !
mxmlnkn
1
**a été ajouté dans Git 1.8.2. Y a-t-il un inconvénient à utiliser !*/au lieu de !/**/?
mxmlnkn
@TamaMcGlinn Cela ressemble à une regex: gitignore ne supporte pas les regex.
VonC
50
*
!*/
!*.*

* dit à git d'ignorer tout.

!*/puis annule tout ce qui est un répertoire. C'est crucial.

!*.* annule tous les fichiers avec une extension.

Sans la !*/règle, les répertoires sans un .dans le nom ne seraient pas répertoriés et aucun de vos fichiers souhaités ne serait ajouté en dehors du dossier racine.

Pour référence, lisez ces deux sections de la documentation .gitignore qui se démarquent:

Un préfixe facultatif "!" ce qui annule le modèle; tout fichier correspondant exclu par un modèle précédent sera de nouveau inclus. Il n'est pas possible de ré-inclure un fichier si un répertoire parent de ce fichier est exclu. Git ne répertorie pas les répertoires exclus pour des raisons de performances, donc tous les modèles sur les fichiers contenus n'ont aucun effet, peu importe où ils sont définis. Mettez une barre oblique inverse ("\") devant le premier "!" pour les modèles commençant par un littéral "!", par exemple, "! important! .txt".

Si le modèle se termine par une barre oblique, il est supprimé aux fins de la description suivante, mais il ne trouvera qu'une correspondance avec un répertoire. En d'autres termes, foo / correspondra à un répertoire foo et les chemins en dessous, mais ne correspondra pas à un fichier normal ou à un lien symbolique foo (cela est cohérent avec la façon dont pathspec fonctionne en général dans Git).

Physicien fou
la source
1
Bonne prise. +1. J'avais oublié de mettre à jour ma réponse avec cette règle que j'avais récemment utilisée dans d'autres réponses de mines. J'ai mis à jour ma réponse en conséquence.
VonC le
0

Dans mes dossiers, il y a beaucoup de fichiers avec des *.c, *.h, *.txt, *.csvextensions, etc. et des fichiers binaires sans aucune extension. Je devais donc ignorer tous les fichiers exécutés *.c,*.het .gitignore, donc cela fonctionne pour moi, à partir de l' .gitignoreexemple:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
Antranig Avakian
la source