Git ignorer les sous-dossiers

438

J'ai beaucoup de projets dans ma solution .Net. Je voudrais exclure tous les dossiers "bin / Debug" et "bin / Release" (et leur contenu), mais inclure toujours le dossier "bin" lui-même et toutes les DLL qu'il contient.

.gitignore avec "bin /" ignore les dossiers "Debug" et "Release", mais aussi toutes les DLL contenues dans le dossier "bin".

"bin / Debug" ou "bin / Release" dans le fichier .gitignore n'exclut pas les répertoires, sauf si je qualifie complètement le modèle d'ignorance comme "Solution / Project / bin / Debug" - ce que je ne veux pas faire comme je devra inclure ce modèle complet pour chaque projet dans ma solution, ainsi que l'ajouter pour tout nouveau projet ajouté.

Aucune suggestion?

Marcel
la source
Pourquoi ajouter les DLL? Si vous faites référence à des DLL tierces, il peut être judicieux d'ajouter un dossier commun que tous vos projets référencent ensuite.
Paddy
6
Paddy a raison - s'il s'agit de DLL tierces, elles devraient probablement être organisées loin de votre code. Pour moi, cependant, il semble que vous archivez vos propres produits de construction, ce qui n'est généralement pas la voie que vous souhaitez suivre. Vous utilisez git pour suivre les informations , qui sont entièrement contenues dans le code et la configuration de construction. Les produits sont, eh bien, des produits. Leur suivi demande des problèmes - par exemple, que se passe-t-il si vous modifiez le code mais oubliez de créer et d'archiver de nouveaux produits?
Cascabel
J'ai eu un problème pour exclure les sous-dossiers. J'ai tout essayé, y compris les échantillons exacts écrits ici, mais sans succès. Enfin, j'ai ajouté une ligne vierge supplémentaire entre les modèles de dossier, et cela fonctionne. Peut-être un problème d'encodage. J'ai des fenêtres et je l'ai encodé en UTF8.
RoadBump

Réponses:

552

Avez-vous essayé les caractères génériques?

Solution/*/bin/Debug
Solution/*/bin/Release

Avec la version 1.8.2 de git, vous pouvez également utiliser le **caractère générique pour faire correspondre n'importe quel niveau de sous-répertoires:

**/bin/Debug/
**/bin/Release/
Josh Lee
la source
8
Cela fonctionne, sauf s'il y a un sous-dossier avec un autre projet dans par exemple Solution / Module / Project donc pour l'instant j'ai ajouté / * / * / bin / Debug et / * / * / * / bin / Debug (pour sub Dossiers). Il semble que vous deviez ajouter un sous-dossier générique pour chaque niveau de votre structure de répertoires.
Marcel
1
@Marcel: Eh bien, git ne va certainement pas ignorer les fichiers auxquels vous ne le dites pas - il ignore tout ce qui correspond aux caractères génériques, ni plus, ni moins.
Cascabel
Je pense que la double étoile traversera les limites des répertoires, c'est-à-dire: / ** / bin / Debug
Trent
11
@ Taras: Malheureusement, ce n'est pas le cas.
Tuukka Mustonen
2
Il y avait un bogue sur Visual Studio lié à **. Devrait être corrigé maintenant. link
Bogac
106

Vous pouvez utiliser .gitignore au niveau supérieur pour ignorer tous les répertoires du projet portant le même nom. Par exemple:

Debug/
Release/

Cela devrait être mis à jour immédiatement afin qu'il soit visible lorsque vous faites le statut git. Assurez-vous que ces répertoires ne sont pas déjà ajoutés à git, car cela remplacera les ignorés.

Andreas
la source
La même chose pourrait être faite en ajoutant les modèles au $GIT_DIR/.git/info/excludefichier OPs .
Tim Henigan
1
La différence est que le fichier .gitignore suivra le code, il s'applique donc partout. Alors que le fichier d'exclusion est local à votre référentiel uniquement, ce qui signifie qu'il ne s'applique qu'à ce référentiel spécifique. Sauf si d'autres committers ont une raison de vouloir valider ces répertoires, je recommanderais d'utiliser .gitignore.
Andreas
1
Un autre problème avec cela est si vous avez un projet dans votre solution appelé Debug, qui sera également ignoré. Je pense que la solution est une combinaison de toutes les réponses et commentaires - restructurer la solution pour conserver les DLL communes ou référencées dans un dossier différent, puis ignorer "bin /" et / ou utiliser des caractères génériques.
Marcel
16
+1 Pour des commentaires sur la garantie que les répertoires ne sont pas déjà ajoutés à git. Si déjà ajouté à git, faites:git rm -rf DirectoryName/
levibostian
57

La question ne demande pas d'ignorer tous les sous - répertoires, mais je ne pouvais pas trouver nulle part de réponse, alors je vais le poster: */*.

mgold
la source
1
Une chance que vous pourriez clarifier? J'ai essayé toutes sortes de variantes à ce sujet et je n'arrive pas git addà ignorer un répertoire et tous les fichiers dans tous les sous-répertoires de ce répertoire. Je l' ai essayé dirname/, dirname/*, dirname/**, dirname/*/*, même en désespoir de cause dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Chris
3
*/*ignore tous les sous-répertoires mais pas les fichiers du répertoire courant. Ignorer un sous-répertoire spécifique est une utilisation normale de gitignore. dirname, dirname/et dirname/*tout fonctionne pour moi. Quelque chose dans ce répertoire a-t-il déjà été validé?
mgold
C'est un tout nouveau dépôt - je supprime le .gitrépertoire entier entre les tentatives, git initpuis git add --all .(j'ai également essayé sans --all), en utilisant 1.9.4.msysgit.1. Chaque sous-répertoire non vide sous mon répertoire nommé est ajouté à l'index (vérifié dans TortoiseGit et git status). Il n'y a pas de ligne de .gitignoredépart pertinente !mais il doit y avoir un conflit. Résolu pour l'instant en supprimant les dossiers pendant add. Je suppose que c'est quelque chose qui nécessitera un peu plus de fouilles pour fournir les informations nécessaires au diagnostic. Merci de m'avoir rassuré sur le fait que je ne comprends pas mal la syntaxe.
Chris
Que faire si j'ai besoin d'ignorer un dossier dans un dossier, mais pas le premier? Comme dans forum / ignorethisfolder / ... mais il ne doit pas ignorer le dossier appelé forum
Jean Carlos Racoski
Cela ne fonctionne pas pour moi en ignorant un répertoire dont le nom commence par un point. " /. " et ". * / *" ne fonctionnent pas non plus.
Tony
44

Toutes les réponses ci-dessus sont valides, mais je ne pense pas que ce qui est mentionné est qu'une fois que vous ajoutez un fichier de ce répertoire dans le référentiel, vous ne pouvez pas ignorer le répertoire / sous-répertoire qui contient ce fichier (git ignorera cette directive ).

Pour ignorer les fichiers déjà ajoutés, exécutez

$ git rm --cached

Sinon, vous devrez d'abord supprimer tous les fichiers du répertoire cible du référentiel - puis vous pouvez ignorer ce dossier.

ajacian81
la source
12
git rm --cached si vous voulez qu'ils ne soient pas suivis / sans rapport avec l'historique mais que vous voulez garder les fichiers intacts localement.
Erik Reppen
29

En plus de mettre les entrées correctes dans votre fichier .gitignore, si vous essayez d'ignorer quelque chose déjà ajouté au dépôt, vous devez le faire git rm -r /path/to/diret le valider avant d'ajouter le dir à votre fichier .gitignore. Sinon, la seule chose que git ignorera est votre directive ignore.

MinuitJava
la source
19

La seule façon de faire fonctionner cela sur ma machine était de le faire de cette façon:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

Remarquez comment vous devez autoriser explicitement le contenu pour chaque niveau que vous souhaitez inclure. Donc, si j'ai des sous-répertoires 5 sous les thèmes, je dois encore le préciser.

Ceci provient du commentaire de @ Yarin ici: https://stackoverflow.com/a/5250314/1696153

Ces sujets étaient utiles:

J'ai aussi essayé

*
*/*
**/**

et **/wp-content/themes/**

ou /wp-content/themes/**/*

Rien de tout cela n'a fonctionné pour moi non plus. Beaucoup de traces et d'erreurs!

Katie
la source
13

Pour exclure du contenu et des sous-répertoires:

**/bin/*

Pour simplement exclure tous les sous-répertoires mais prendre le contenu, ajoutez "/":

**/bin/*/
A. Morel
la source
9

Pour ignorer tous les sous-répertoires, vous pouvez simplement utiliser:

**/

Cela fonctionne à partir de la version 1.8.2 de git.

frederickjh
la source
8

La façon générique d'ignorer tous les sous-dossiers, tout en continuant à suivre les fichiers qui se trouvent dans le /binrépertoire serait d'ajouter la ligne suivante au fichier .gitignore de votre projet:

bin/*/*

Si vous souhaitez ignorer uniquement des sous-dossiers nommés particuliers, vous pouvez faire:

bin/Debug/*
bin/Release/*

nb. si le binrépertoire n'est pas à la racine de votre projet (à côté du fichier .gitignore), alors au lieu de par exemple. bin/*/*vous pourriez avoir besoinpath/to/bin/*/*

Nick F
la source