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

Réponses:

123

Jamais essayé, mais git help ignoresuggère que si vous mettez un .gitignoreavec *.jsen /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.

ptyx
la source
19
Ce n'est pas nécessairement la meilleure solution. Potentiellement, les utilisateurs devront fouiller dans différents fichiers .gitignore pour trouver pourquoi leur fichier est ignoré. Certains préfèrent avoir toutes ces informations dans un fichier .gitignore stocké dans le répertoire racine du dépôt.
haren
1
@haren ce n'est pas la seule solution - la réponse de Joey est certainement également valable. Choisissez ce qui vous convient le mieux. Je dirais qu'ignorer les règles locales à un répertoire devrait être dans ce répertoire, et que les règles globales devraient être globales. (De plus, cette réponse est ancienne et je ne pense pas que ** était pris en charge à l'époque).
ptyx
211

Il semblerait que la **syntaxe soit prise en charge par à gitpartir de la version 1.8.2.1selon 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 .gitignorefichier, 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.

Joeyhoer
la source
1
quelle est la différence entre xxx/**et xxx/?
thuzhf
9
xxx/**cible tous les fichiers et répertoires à l'intérieur de xxxtandis que xxx/cible xxxdirectement 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.
joeyhoer
4
Tous les fichiers avec l'extension .meta doivent être ignorés par git. Comment cela marche-t-il? **.js?
Noir
"Les autres astérisques consécutifs sont considérés comme invalides." somme tout
imrok
68

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 .gitignorefichier 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/*.jscorrespondra /public/static/foo.jsmais pas /public/static/foo/bar.js .) La suppression du début /ne fonctionnera pas non plus, la correspondance des chemins comme public/static/foo.jset foo/public/static/bar.js. 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é).

Comme @ptyx l'a suggéré, ce que vous devez faire est de créer le fichier <repo>/public/static/.gitignoreet 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/staticrépertoire et de ses sous-répertoires.

Adam Sharp
la source
2
Ce n'est pas tout à fait vrai - en particulier la partie "Supprimer le début /ne fonctionnera pas non plus, faire correspondre des chemins comme public/static/foo.jset 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.jsne correspondrait pas car le modèle contient un /.
joeyhoer
@JoeyHoer grâce à la pointe, j'ai mis à jour ma réponse en conséquence.
Adam Sharp
9

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.

Thiago Ramos
la source
2
Cela ne se répercuterait pas sur d'autres clones du référentiel comme le ferait .gitignore (après avoir été validé, bien sûr).
jpmc26
3

Je pense que la solution la plus simple serait d'utiliser find. Je n'aime pas avoir plusieurs .gitignoretraî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-.

Garini
la source