2659 votes

Faire que .gitignore ignore tout sauf quelques fichiers

Je comprends qu'un fichier .gitignore cache des fichiers spécifiques au contrôle de version de Git. de Git. J'ai un projet (LaTeX) qui génère beaucoup de fichiers supplémentaires (.auth, .dvi, .pdf, logs, etc) au fur et à mesure de son exécution, mais je ne veux pas qu'ils soient suivis.

Je suis conscient que je pourrais (peut-être devrais) faire en sorte que tous ces fichiers soient placés dans un sous-dossier séparé du projet, puisque je pourrais alors ignorer le pliage. sous-dossier séparé dans le projet, puisque je pourrais alors simplement ignorer le dossier.

Cependant, existe-t-il un moyen de conserver les fichiers de sortie dans la racine de l'arborescence du projet et d'utiliser les fichiers .g. ? l'arbre du projet et d'utiliser .gitignore pour tout ignorer sauf les fichiers que je suivis avec Git ? Quelque chose comme

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...

20 votes

Duplicata de stackoverflow.com/q/9162919/321973 (Je sais que c'est plus récent, mais la réponse est plus correcte). En fait, cette réponse est probablement le meilleur

3558voto

Joakim Elofsson Points 5048

Un préfixe facultatif ! qui annule le motif ; tout fichier correspondant exclu par un motif précédent sera à nouveau inclus. Si un motif annulé correspond, cela remplacera les sources de motifs de priorité inférieure.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*

17 votes

Il semble que cela ignore également les sous-dossiers, de sorte que tout fichier nommé 'script.pl' dans un répertoire autre que le répertoire racine ne sera pas trouvé de toute façon. J'utilise ceci maintenant (avec *.pl) et tous les fichiers *.pl sont ignorés même s'il y en a beaucoup dans les sous-répertoires sous le fichier .gitignore.

43 votes

Cette question a été soulevée. ici (stackoverflow.com). Cela est dû au fait que la première expression correspond à tout, y compris les répertoires, que vous ne pouvez jamais annuler. Pour le corriger, ajoutez (!*/), qui correspond à tous les sous-répertoires (récursivement) du répertoire actuel. Cela n'aidera pas la réponse principale, qui est la mise en liste blanche de fichiers spécifiques (s'ils sont dans des sous-répertoires, vous voudrez probablement spécifier manuellement le chemin complet, ou utiliser des fichiers .gitignore spécifiques au répertoire).

3 votes

@huyz pas vraiment, quand .gitignore est à l'intérieur du dépôt, les changements qui lui sont apportés ne seront pas ignorés (comme pour tous les fichiers). .gitignore s'ignore lui-même avant d'être ajouté, on peut le contourner en faisant 'git add -f .gitignore' (comme mentionné lors de l'essai).

1112voto

Giuseppe Galano Points 773

Si vous souhaitez ignorer l'ensemble du contenu d'un répertoire, à l'exception d'un fichier qui s'y trouve, vous pouvez écrire une paire de règles pour chaque répertoire du chemin d'accès au fichier. Par exemple .gitignore d'ignorer le pippo sauf dans le cas de pippo/pluto/paperino.xml

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

Notez que si vous aviez simplement écrit ci-dessus :

pippo/*
!pippo/pluto/paperino.xml

Ça ne marcherait pas parce que l'intermédiaire pluto n'existerait pas pour Git, donc paperino.xml ne pouvait pas trouver un endroit où exister.

111 votes

Excellente réponse, mais il est utile de noter pour ceux qui tomberont sur ce sujet plus tard que foo et foo/* sont pas la même chose. Pour que cela fonctionne, vous devez besoin de à utiliser foo/* pour le dossier de base

47 votes

@Mayank Pippo est Goofy en italien, Paperino est Donald Duck et Pluto est le même qu'en anglais. C'était un triplet très courant de noms de variables pour les échantillons de programmation à l'époque. C'était agréable de les relire :)

0 votes

Ce que dit @thislooksfun est important si vous voulez "exclure un dossier sauf le fichier x".

105voto

Nik Points 451

Un peu plus précis :

Exemple : Ignorez tout ce qui se trouve dans webroot/cache - mais gardez webroot/cache/.htaccess .

Remarquez la barre oblique (/) après le cache dossier :

ÉCHECS

webroot/cache*
!webroot/cache/.htaccess

TRAVAUX

webroot/cache/*
!webroot/cache/.htaccess

0 votes

Si vous utilisez VS Code, faites attention à ne pas mal interpréter la coloration du fichier après avoir appliqué ceci à un dossier avec .gitkeep parce que le nom du dossier deviendra vert mais le fichier .gitkeep deviendra gris comme tous les autres fichiers ignorés ; .gitkeep semblera être ignoré mais vous devriez voir qu'il y a un 'U' sur le côté droit, indiquant qu'il a été détecté.

90voto

Suvesh Pratapa Points 3735
# ignore these
*
# except foo
!foo

35voto

sealTrip Points 389

Pour ignorer certains fichiers d'un répertoire, vous devez le faire dans la section ordre correct :

Par exemple, ignorez tout ce qui se trouve dans le dossier "application" sauf index.php et le dossier "config". faites attention à l'ordre .

Vous devez d'abord nier ce que vous voulez.

ÉCHECS

application/*

!application/config/*

!application/index.php

TRAVAUX

!application/config/*

!application/index.php

application/*

46 votes

Faux. Vous niez après le "ignorez tout".

3 votes

Ne vous laissez pas berner par git status pour vérifier si vos modifications de .gitignore fonctionnent comme prévu

14 votes

Si git status ne va pas vous dire ce qu'il regarde et ce qu'il ignore, alors comment pouvez-vous savoir si cela fonctionne ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X