Existe-t-il un moyen d'ignorer tous les fichiers d'un type dans un répertoire?
**
n'a apparemment aucun sens pour git, donc cela ne fonctionne pas:
/public/static/**/*.js
L'idée est de faire correspondre des dossiers imbriqués arbitraires.
Existe-t-il un moyen d'ignorer tous les fichiers d'un type dans un répertoire?
**
n'a apparemment aucun sens pour git, donc cela ne fonctionne pas:
/public/static/**/*.js
L'idée est de faire correspondre des dossiers imbriqués arbitraires.
Réponses:
Jamais essayé, mais git help ignore
suggère que si vous mettez un .gitignore
avec *.js
en /public/static
, il fera ce que vous voulez.
Remarque: assurez-vous de consulter également la réponse de Joeys ci-dessous: si vous voulez ignorer les fichiers dans un sous-répertoire spécifique, alors un .gitignore local est la bonne solution (la localité est bonne). Cependant, si vous avez besoin du même modèle à appliquer à l'ensemble de votre dépôt, la solution ** est meilleure.
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 les motifs mis en correspondance avec le chemin complet peuvent avoir une signification particulière:
Un "
**
" en tête suivi d'une barre oblique signifie que tous les répertoires correspondent. Par exemple, "**/foo
" correspond au fichier ou au répertoire "foo
" n'importe où, comme 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 qu'il contient. Par exemple, "abc/**
" correspond à tous les fichiers dans le répertoire "abc
", par rapport à l'emplacement du.gitignore
fichier, avec une profondeur infinie.Une barre oblique suivie de deux astérisques consécutifs, puis une barre oblique correspond à zéro ou plusieurs répertoires. Par exemple, "
a/**/b
" correspond à "a/b
", "a/x/b
", "a/x/y/b
" et ainsi de suite.Les autres astérisques consécutifs sont considérés comme invalides.
xxx/**
et xxx/
?
xxx/**
cible tous les fichiers et répertoires à l'intérieur de xxx
tandis que xxx/
cible xxx
directement le répertoire. Cela n'a vraiment d'importance que lorsque vous annulez des modèles avec !
comme "Il n'est pas possible de ré-inclure un fichier si un répertoire parent de ce fichier est exclu.", Donc utiliser xxx/*
ou xxx/**
serait nécessaire dans ce cas.
**.js
?
MISE À JOUR: Jetez un œil à la réponse de @ Joey : Git prend désormais en charge la **
syntaxe dans les modèles. Les deux approches devraient fonctionner correctement.
La page de manuel gitignore (5) indique:
Modèles lus à partir d'un fichier .gitignore dans le même répertoire que le chemin, ou dans n'importe quel répertoire parent, les modèles dans les fichiers de niveau supérieur (jusqu'au niveau supérieur de l'arborescence 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 dans un .gitignore
fichier dans n'importe quel répertoire donné de votre dépôt 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, premièrement parce que (comme vous l'avez bien noté) la **
syntaxe n'est pas utilisée par Git. En outre, le premier /
ancre ce modèle au début du chemin. (Donc, /public/static/*.js
correspondra /public/static/foo.js
mais pas /public/static/foo/bar.js
.) La suppression du début EDIT: Le simple fait de supprimer la barre oblique principale ne fonctionnera pas non plus - parce que le modèle contient toujours une barre oblique, il est traité par Git comme un shell global non récursif (merci @Joey Hoer pour l'avoir signalé)./
ne fonctionnera pas non plus, la correspondance des chemins comme public/static/foo.js
et foo/public/static/bar.js
.
Comme @ptyx l'a suggéré, ce que vous devez faire est de créer le fichier <repo>/public/static/.gitignore
et d'inclure uniquement ce modèle:
*.js
Il n'y a pas de début /
, donc il correspondra à n'importe quelle partie du chemin, et ce modèle ne sera jamais appliqué qu'aux fichiers du /public/static
répertoire et de ses sous-répertoires.
/
ne fonctionnera pas non plus, faire correspondre des chemins comme public/static/foo.js
et foo/public/static/bar.js
". c'est faux. Pour citer la documentation "Si le modèle ne contient pas de barre oblique /, Git le traite comme un modèle de shell glob et vérifie une correspondance avec le chemin d'accès relatif à l'emplacement du fichier .gitignore (par rapport au niveau supérieur de l'arborescence de travail si pas à partir d'un fichier .gitignore). " foo/public/static/bar.js
ne correspondrait pas car le modèle contient un /
.
Pour ignorer les fichiers non suivis, accédez simplement à .git / info / exclude. Exclure est un fichier avec une liste d'extensions ou de fichiers ignorés.
Je pense que la solution la plus simple serait d'utiliser find
. Je n'aime pas avoir plusieurs .gitignore
traîner dans les sous-répertoires et je préfère gérer un unique, de premier niveau .gitignore
. Pour ce faire, vous pouvez simplement ajouter les fichiers trouvés à votre fichier .gitignore
. En supposant que ce /public/static/
soit votre projet / git home, j'utiliserais quelque chose comme:
find . -type f -name *.js | cut -c 3- >> .gitignore
J'ai trouvé que couper ./
le début est souvent nécessaire pour que git comprenne quels fichiers éviter. Par conséquent, le cut -c 3-
.