web-dev-qa-db-fra.com

gitignore tous les fichiers d'extension dans le répertoire

Est-il possible d'ignorer tous les fichiers d'un type dans un répertoire?

** est apparemment sans signification pour git, donc cela ne fonctionne pas:

/public/static/**/*.js

L'idée est de faire correspondre les dossiers imbriqués arbitraires.

161
Harry

Jamais essayé, mais git help ignore suggère que si vous mettez un .gitignore avec *.js dans /public/static, il fera ce que vous voulez.

Remarque: assurez-vous également de vérifier la réponse de Joeys ci-dessous: si vous souhaitez ignorer les fichiers d'un sous-répertoire spécifique, un fichier .gitignore local est la bonne solution (la localité est bonne). Toutefois, si vous souhaitez appliquer le même modèle à l'ensemble de votre pension, la solution ** est préférable.

105
ptyx

Il semblerait que la syntaxe ** soit prise en charge par git à partir de la version 1.8.2.1 selon la documentation .

Deux astérisques consécutifs ("**") dans des modèles comparés à un chemin complet peuvent avoir une signification particulière:

  • Un "**" majuscule suivi d'une barre oblique signifie une correspondance dans tous les répertoires. Par exemple, "**/foo" correspond au fichier ou au répertoire "foo", de la même manière que le modèle "foo". "**/foo/bar" correspond au fichier ou au répertoire "bar" n'importe où se trouvant directement sous le répertoire "foo".

  • Un "/**" final correspond à tout ce qui se trouve à l'intérieur. Par exemple, "abc/**" correspond à tous les fichiers du répertoire "abc", par rapport à l'emplacement du fichier .gitignore, avec une profondeur infinie.

  • Une barre oblique suivie de deux astérisques consécutifs, puis une barre oblique ne correspond à aucun ou plusieurs répertoires. Par exemple, "a/**/b" correspond à "a/b", "a/x/b", "a/x/y/b", etc.

  • Les autres astérisques consécutifs sont considérés comme non valides.

181
joeyhoer

UPDATE: Regardez @ Joey's answer : Git supporte maintenant la syntaxe ** dans les patterns. Les deux approches devraient bien fonctionner.


La page de manuel gitignore (5) indique:

Les patterns lus depuis un fichier .gitignore dans le même répertoire que le chemin d'accès, ou dans n'importe quel répertoire parent, les patterns des fichiers de niveau supérieur (jusqu'au niveau supérieur de l'arbre de travail) étant remplacés par ceux des fichiers de niveau inférieur jusqu'au répertoire contenant le fichier.

Cela signifie que les modèles d'un fichier .gitignore dans un répertoire donné de votre référentiel affecteront ce répertoire et tous les sous-répertoires .

Le modèle que vous avez fourni

/public/static/**/*.js

n'est pas tout à fait correct, d'abord parce que (comme vous l'avez bien noté) la syntaxe ** n'est pas utilisée par Git. De plus, le / initial marque ce motif au début du chemin. (Ainsi, /public/static/*.js correspondra à /public/static/foo.js mais pas /public/static/foo/bar.js.) La suppression de / initial ne fonctionnera pas non plus, les chemins correspondants tels que public/static/foo.js et foo/public/static/bar.js. EDIT: Supprimer simplement la barre oblique principale ne fonctionnera pas non plus - car le motif contient toujours une barre oblique, il est traité par Git comme un simple glob Shell non récursif (merci @ Joey Hoer pour avoir pointé ce en dehors).

Comme @ptyx l'a suggéré, vous devez créer le fichier <repo>/public/static/.gitignore et inclure uniquement ce modèle:

*.js

Il n'y a pas de / initial, il en résultera donc à n'importe quelle partie du chemin, et ce motif ne sera appliqué qu'aux fichiers du répertoire /public/static et de ses sous-répertoires.

62
Adam Sharp

Pour ignorer les fichiers non suivis, allez simplement dans .git/info/exclude. Exclure est un fichier avec une liste d'extensions ou de fichiers ignorés.

9
Thiago Ramos

Je pense que la solution la plus simple serait d’utiliser find. Je n'aime pas avoir plusieurs .gitignore traînant dans des sous-répertoires et je préfère gérer un .gitignore de niveau supérieur unique. Pour ce faire, vous pouvez simplement ajouter les fichiers trouvés à votre .gitignore. En supposant que /public/static/ soit votre projet/git home, je voudrais utiliser quelque chose comme:

find . -type f -name *.js | cut -c 3- >> .gitignore

J'ai trouvé qu'il était souvent nécessaire de couper le ./ au début pour que git comprenne quels fichiers éviter. Par conséquent, le cut -c 3-.

3
Garini