Utiliser .gitignore pour ignorer tout sauf des répertoires spécifiques

140

Mon problème est que j'ai un tas de sites Web WordPress dans mon repo git, dont je veux ne valider sélectivement que le contenu de mes themesdossiers, tout en ignorant le reste des fichiers redondants trouvés dans WordPress.

J'ai déjà utilisé des fichiers .gitignore pour ignorer les types de fichiers, mais peut-il être utilisé dans l'autre sens - c'est-à-dire pour tout ignorer MAIS un certain chemin de dossier?

root (git repo)
- / wordpress
- - / (WordPress Site 1) / wp-content / themes
- - / (WordPress Site 2) / wp-content / themes
- - / (WordPress Site 3) / wp-content / themes

Merci-

METTRE À JOUR:

Sur la base des réponses, j'ai fait ce qui suit, mais cela ne fonctionne pas. Des idées?

# Ignore everything:
*
# Except for wordpress themes:
!*/wp-content/themes/*

J'ai également essayé les variantes suivantes:

!*/wp-content/themes*
!*wp-content/themes/*
!wp-content/themes/*
!/wordpress/*/wp-content/themes*
!wordpress/*/wp-content/themes*

Aucun de ceux-ci ne lit mes themesdossiers.

Yarin
la source

Réponses:

133

Voici comment je l'ai fait - vous devez essentiellement marcher sur les chemins, vous ne pouvez pas joker plus d'un niveau dans n'importe quelle direction:

# Ignore everything:
*

# Except for the themes directories:

!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

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

Ce n'est que comment cela a fonctionné pour moi. Si quelqu'un se soucie d'offrir une explication plus éclairée par tous les moyens.

En outre, ces réponses sont utiles:
comment-faire-des-modèles-de-négation-travailler-dans-gitignore
comment-faire-gitignore-exclusion-règles-en fait-fonctionner


REMARQUE: j'ai essayé d'utiliser des `` globs '' à double caractère générique, mais selon cela, cette fonctionnalité dépend du système et cela n'a pas fonctionné sur mon mac:

N'a pas marché:

!**/wp-content/themes/
!**/wp-content/themes/**
Yarin
la source
4
avant git 1.8.4 le **joker ne fonctionne que si vous n'avez pas de barres obliques dans votre modèle, voir sparethought.wordpress.com/2011/07/19
Cela devrait fonctionner:!/wordpress/*/wp-content/themes/**/*
that0n3guy
1
Cette syntaxe fonctionne-t-elle sous Windows? Cela ne semble pas fonctionner pour moi ...
ScottF
Cela fonctionne à merveille sous Windows 10. L'utiliser pour toutes sortes de projets personnalisés à partir de Visual Studio Code.
klewis
J'ai utilisé une combinaison de cette réponse et de celle fournie par @ 吴毅 凡, qui a fonctionné pour moi.
MikeyE
95

J'ai essayé ce qui précède et ils n'ont pas si bien fonctionné. Une meilleure approche est la suivante à partir d'ici: https://gist.github.com/444295

# This is a template .gitignore file for git-managed WordPress projects.
#
# Fact: you don't want WordPress core files, or your server-specific
# configuration files etc., in your project's repository. You just don't.
#
# Solution: stick this file up your repository root (which it assumes is
# also the WordPress root directory) and add exceptions for any plugins,
# themes, and other directories that should be under version control.
#
# See the comments below for more info on how to add exceptions for your
# content. Or see git's documentation for more info on .gitignore files:
# http://kernel.org/pub/software/scm/git/docs/gitignore.html

# Ignore everything in the root except the "wp-content" directory.
/*
!.gitignore
!wp-content/

# Ignore everything in the "wp-content" directory, except the "plugins"
# and "themes" directories.
wp-content/*
!wp-content/plugins/
!wp-content/themes/

# Ignore everything in the "plugins" directory, except the plugins you
# specify (see the commented-out examples for hints on how to do this.)
wp-content/plugins/*
# !wp-content/plugins/my-single-file-plugin.php
# !wp-content/plugins/my-directory-plugin/

# Ignore everything in the "themes" directory, except the themes you
# specify (see the commented-out example for a hint on how to do this.)
wp-content/themes/*
# !wp-content/themes/my-theme/
dwenaus
la source
1
@ dwenaus- merci d'avoir partagé ceci- semble utile pour les dépôts enracinés dans un répertoire wordpress spécifique, mais ne fonctionnera pas sur les dépôts de plusieurs sites wordpress en dessous, ce que je recherchais ..
Yarin
Cette structure / modèle est super utile. Je voulais un référentiel unique pour une installation combinée de Magento / WP, et avec moins de 30 lignes de .gitignore utilisant cette technique, j'ai pu le réduire aux fichiers de thème / skin Magento et aux fichiers de thème WP. Merci!
random_user_name
n'utilisez simplement pas cette configuration avec le déploiement automatique car un utilisateur novice de git pourrait gâcher des fichiers en dehors des zones indentées (c'est-à-dire s'il supprime tous les fichiers du dépôt par accident et que celui-ci est automatiquement déployé, ce sera compliqué). A part ça, ça marche bien.
dwenaus
Vous êtes l'homme mec! Surtout si votre version est> = 2.1.4. Ref: git-scm.com/docs/gitignore/2.1.4
Haktan Suren
28

modifier la première ligne

*

changez-le en

/*
吴毅 凡
la source
2
Ce travail pour moi. Mon fichier .gitignore est comme ceci / *! .Gitignore! /
Vendors
12

Essayez ces réponses:

Faites en sorte que .gitignore ignore tout sauf quelques fichiers

# Ignore everything
*

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

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

Comment dire à Git d'ignorer tout sauf un sous-répertoire?

Cela ignore les fichiers racine et les répertoires racine, puis annule le répertoire bin racine:

/*
/*/
!/bin/

De cette façon, vous obtenez tout le répertoire bin, y compris les sous-répertoires et leurs fichiers.

irriter
la source
@ irriter- Merci, je ne les ai pas vus- cependant, j'ai du mal à les appliquer à ma situation. Voir mes modifications ci-dessus ...
Yarin
1
Le deuxième lien que j'ai publié indique que vous auriez besoin des deux !*/wp-content/themes/et !*/wp-content/themes/*. Avez-vous essayé cette variante? De plus, comme alternative, vous pouvez simplement utiliser !*/wp-content/themes/et dans chaque répertoire de thèmes avoir son propre fichier .gitignore avec!*
irriter
1
@ irritate- non cette variation ne fonctionne pas non plus, et de toute façon je ne vois pas en quoi cela serait différent de!*/wp-content/themes*
Yarin
9

Si vous préfixez un modèle avec un point d'exclamation ( !), il annule tout modèle précédent qui l'a exclu. Donc, vraisemblablement, vous pouvez tout ignorer, puis n'autoriser que ce que vous voulez en utilisant ce modèle.

dappawit
la source
@ dappawit- Merci- le concept a du sens, et je l'ai fait fonctionner pour les fichiers, mais pas pour mes dossiers de thèmes - voir mes modifications ci-dessus ...
Yarin
Je ne suis pas un expert des modèles glob, mais en lisant la page de manuel .gitignore, je pense que cela peut fonctionner: !wordpress/[write out directories]/wp-content/themes/ . Notez la barre oblique de fermeture et aucun astérisque de fermeture. Notez également que *ne correspondra qu'à un seul niveau, pas à plusieurs répertoires. Voici la page de manuel: kernel.org/pub/software/scm/git/docs/gitignore.html
dappawit
M'a aidé à réaliser que je devais mettre la négation après les autres règles merci
Axe
6

J'avais besoin d'ignorer tout mais pas un dossier avec des sous-répertoires.

Pour moi, cela fonctionne

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt
Matias Seguel
la source
5

Supposons que vous ayez une structure de répertoires comme celle-ci:

– sites
– -all
– – – -files
– – – – – -private
– – – – – – – -newspilot
– -default
– – – -files
– – – – – -private
– – – – – – – -newspilot

Quand tu veux autoriser uniquement les sites / all / files / private / newspilot et sites / default / files / private / newspilot , vous pouvez, dans un premier temps, essayer ceci:

sites/*/files/*
!sites/*/files/private/newspilot

C'est faux!Le problème avec gitignore est que vous devez d'abord autoriser l'inclusion du répertoire parent ("private") , avant de pouvoir autoriser son répertoire enfant ("newspilot") à être inclus dans les commits.

sites/*/files/*
!sites/*/files/private
sites/*/files/private/*
!sites/*/files/private/newspilot

http://www.christianengvall.se/gitignore-exclude-folder-but-include-a-subfolder/

Peeter Kokk
la source
"vous devez d'abord autoriser l'inclusion du répertoire parent, avant de pouvoir autoriser son répertoire enfant" - Merci de le signaler! C'était précisément mon problème.
Jet Blue
4

La réponse de Yarin a fonctionné pour moi, voici ma version (je n'ai pas besoin du /wordpresssous-répertoire):

*

!.gitignore
!/wp-content/
!/wp-content/themes/
!/wp-content/themes/*
!/wp-content/themes/*/*
!/wp-content/themes/*/*/*
!/wp-content/themes/*/*/*/*
!/wp-content/themes/*/*/*/*/*

# I don't want to track this one, so it's included here, after the negated patterns. 
wp-content/themes/index.php
cabgfx
la source
4

Je reste toujours coincé quelque part là-dessus même après être revenu sur cette question à plusieurs reprises. J'ai mis au point un processus détaillé pour le faire étape par étape:

Utilisez git addd' abord simplement pour ajouter le contenu réel.

Il affichera les fichiers pertinents ajoutés à l'index tandis que tous les autres ne sont toujours pas suivis. Cela aide à construire .gitignoreétape par étape.

$ git add wp-content/themes/my-theme/*
$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-admin/
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ...
        wp-includes/
        ...

Ajoutez un DUMMY.TXTfichier temporaire dans votre répertoire:

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-admin/
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ...
        wp-content/themes/my-theme/DUMMY.TXT  <<<
        ...
        wp-includes/
        ...

Notre objectif est maintenant de construire les règles de telle sorte que ce DUMMY.TXTsoit la seule qui apparaisse encore comme Non suivi lorsque nous avons terminé.

Commencez à ajouter les règles:

.gitignore

/*

La première consiste simplement à tout ignorer. Les fichiers non suivis devraient tous avoir disparu, seuls les fichiers indexés devraient être affichés:

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

Ajouter le premier répertoire dans le chemin wp-content

/*
!/wp-content

Maintenant, les fichiers non suivis réapparaîtront, mais n'ont que wp-contentle contenu de

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ..

Ignorer tout ce qui se trouve dans le premier répertoire /wp-content/*et désignorer!/wp-content/themes

/*
!/wp-content

/wp-content/*
!/wp-content/themes

Désormais, les fichiers non suivis seront réduits à seulement wp-content/themes

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ..

Répétez le processus jusqu'à ce que ce fichier factice soit le seul à être encore affiché comme non suivi:

/*
!/wp-content

/wp-content/*
!/wp-content/themes

/wp-content/themes/*
!/wp-content/themes/my-theme

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/themes/my-theme/DUMMY.TXT
réflexe de retard
la source
3

Pour ceux qui recherchent une solution plus propre , veuillez essayer ce qui suit.

Comme mentionné dans les commentaires de cette réponse, vous devez utiliser cette méthode de manière récursive.

Dans cet exemple, vous avez une configuration de site Web à l' ./endroit où se trouvent votre .gitdossier et .gitignorefichier et une configuration d'installation de WordPress dans ./wordpress. Pour ignorer correctement tout ce qui se trouve dans le ./wordpressrépertoire à l' exception du répertoire de thème lui-même ( wordpress/wp-content/themes/my-theme), vous devrez ignorer et autoriser récursivement chaque répertoire jusqu'au répertoire que vous souhaitez autoriser:

wordpress/*
wordpress/wp-content/*
wordpress/wp-content/themes/*
!wordpress/wp-content
!wordpress/wp-content/themes
!wordpress/wp-content/themes/my-theme

La raison d'ignorer avec un joker et d'autoriser (ou d'ignorer «en dehors de») le répertoire lui-même permet à Git de regarder d'abord à l'intérieur du répertoire avant d'ignorer tout ce qu'il contient. Nous disons ensuite à Git d'ignorer tout «à part» du répertoire que nous avons spécifié. Voici la même syntaxe mais dans l'ordre de la façon dont Git le regarde:

wordpress/*                            # Ignore everything inside here
!wordpress/wp-content                  # Apart from this directory

wordpress/wp-content/*                 # Ignore everything inside here
!wordpress/wp-content/themes           # Apart from this directory

wordpress/wp-content/themes/*          # Ignore everything inside here
!wordpress/wp-content/themes/my-theme  # Apart from this directory

Espérons que cela aide quelqu'un à mieux comprendre la nécessité de la méthode récursive.

Oliver Tappin
la source
3

en retard à la fête mais voici ce que j'utilise pour une profondeur inconnue (la solution acceptée nécessite une profondeur connue)

/*
!.gitignore
!wp-content/
!*/

de cette façon, tout sous wp-content n'est pas ignoré.

Jubair
la source
3

Après avoir eu besoin de cela plusieurs fois, j'ai enfin trouvé une solution [1]:

/*/
/*.*
!.git*
!/wordpress

Explication ligne par ligne:

  1. Ignorez tous les répertoires à la racine.
  2. Ignorez tous les fichiers avec des extensions à la racine.
  3. Se permettre .gitignore(et potentiellement .gitattributes).
  4. Autoriser le répertoire souhaité avec tous les sous-répertoires

[1] Limitations (dont je suis conscient):

  1. Il n'ignore pas les fichiers sans extension à la racine (et l'ajout /*casserait tout le schéma).
  2. Le répertoire que vous souhaitez inclure à la ligne 4 ( wordpressdans ce cas) ne peut pas avoir .dans le nom (par exemple wordpress.1ne fonctionnerait pas). S'il a un ., supprimez la ligne 2 et trouvez un autre moyen d'exclure tous les fichiers à la racine.
  3. Testé uniquement sous Windows avec git version 2.17.1.windows.2
Dimagog
la source
3

Une autre solution simple:

Vous souhaitez ignorer tous les fichiers Wordpress, mais pas votre thème (par exemple).

.gitignore , le contenu est:

# All wordpress + content of revert ignored directories
wordpress/*
wordpress/wp-content/*
wordpress/wp-content/themes/*

# Revert ignoring directories
!wordpress/
!wordpress/wp-content/
!wordpress/wp-content/themes/
!wordpress/wp-content/themes/my_theme

Dans cet exemple, vous pouvez supprimer wordpress si .gitignore est dans le répertoire racine de wordpress

Vous pouvez faire exactement la même chose avec tous les dossiers et contenus que vous souhaitez "exceptionnellement" garder hors des dossiers / fichiers gitignored

Conclusion :

Assurez-vous de ne pas ignorer tous les répertoires d'un chemin que vous souhaitez annuler

MAIS

Assurez-vous d'ignorer tout le contenu des répertoires non ignorés que vous souhaitez ignorer

Arthur Bouchard
la source
2

Vous pouvez essayer ceci:

!**/themes/*

:

  • ! : nier ignorer (inclure)
  • **: toute arborescence de répertoires (récursivité) donc vous n'avez pas à spécifier le chemin de votre dossier
  • thèmes: votre dossier à inclure (peut être n'importe quoi)
  • *: n'importe quel fichier de ce dossier, vous pouvez également inclure tous les sous-dossiers avec ** et au lieu d'inclure n'importe quel fichier (*), vous pouvez être spécifique * .css, * .xy
Majeur
la source
2

Voici ma solution, qui suppose un paiement en wp-content

# Ignore everything except directories
*
!*/

# except everything in the child theme and its required plugin
!/themes/mytheme-child/**
!/plugins/my-plugin/**

# and this file
!.gitignore

et test:

git version 2.20.1 (Apple Git-117)
$ git check-ignore -v .foo foo foo/ themes/foo themes/foo/bar themes/mytheme-child \
themes/mytheme-child/foo plugins/foo plugins/my-plugin plugins/my-plugin/foo .gitignore
.gitignore:2:*  .foo
.gitignore:2:*  foo
.gitignore:2:*  foo/
.gitignore:2:*  themes/foo
.gitignore:2:*  themes/foo/bar
.gitignore:2:*  themes/mytheme-child
.gitignore:6:!/themes/mytheme-child/**  themes/mytheme-child/foo
.gitignore:2:*  plugins/foo
.gitignore:2:*  plugins/my-plugin
.gitignore:7:!/plugins/my-plugin/** plugins/my-plugin/foo
.gitignore:10:!.gitignore   .gitignore

donc il ignore correctement tout ce que je ne veux pas et rien que je veux garder.

Code de libération

Gitlab est configuré avec des miroirs de référentiel pour les branches protégées, selon https://docs.gitlab.com/ee/workflow/repository_mirroring.html

Lorsque le code est poussé vers une branche protégée, il est mis en miroir sur les serveurs de transfert et de production dans le /opt/checkout/repo.git/référentiel nu. Le post-receivehook suivant (in /opt/checkout/repo.git/hooks/post-receive) extraira alors le code dans le répertoire de travail.

#!/bin/bash

BRANCH=staging
GIT_DIR=/opt/checkout/repo.git
GIT_WORK_TREE=/opt/bitnami/apps/wordpress/htdocs/wp-content

# on push, checkout the code to the working tree
git checkout -f "${BRANCH}"

# ensure permissions are correct
sudo chown -R bitnami:daemon "${GIT_WORK_TREE}"
sudo chmod -R go-w "${GIT_WORK_TREE}"

Pour plus d'informations, voir https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps

Dandines
la source
1

Voici comment je l'ai fait:

# Ignore everything at root:
/*

# Except for directories:
!wordpress/(WordPress Site 1)/wp-content/themes/
!wordpress/(WordPress Site 1)/wp-content/themes/
!wordpress/(WordPress Site 1)/wp-content/themes/

# Except files:
!README

#Except files of type:
!*.txt

C'est ce qui a fonctionné pour moi. Vous permet d'ignorer tout sauf des fichiers ou des dossiers spécifiques

macOS sierra

Gaurav Raghuvanshy
la source
0

Je suis dans le même bateau en essayant de gérer un tas de sites Wordpress sous un référentiel. Ma structure de répertoires ressemble à ceci:

root (git repo)
(WordPress Site 1)/app/public/wp-content/themes
(WordPress Site 2)/app/public/wp-content/themes
(WordPress Site 3)/app/public/wp-content/themes

Je veux simplement suivre les éléments à l'intérieur du app/publicdossier pour chaque site. J'ai essayé les exemples de cette page ainsi que certaines des suggestions ici et j'ai fini par essayer ceci:

/(WordPress Site 1)/*
!(WordPress Site 1)/app
(WordPress Site 1)/app/*
!(WordPress Site 1)/app/public

qui a fonctionné mais je devrais ignorer le même chemin pour chaque site que j'essayais d'éviter.

Ensuite, je viens de remplacer le nom du site par *et cela a fait l'affaire pour moi. Voici donc ce que j'ai fini par utiliser:

/*/*
!*/app
*/app/*
!*/app/public

Cela a effectivement ignoré tout dans le dossier du site tout en capturant tout dans le app/publicdossier pour tout site que je crée à la racine.

Notez qu'il n'ignore pas les fichiers à la racine, juste les répertoires :)

J'espère que cela t'aides.

Henri
la source
0

C'est le seul fichier qui est ignoré dans la plupart des cas, car vous avez wp-config-sample.php que vous pouvez partager avec d'autres.

/wp-config.php
Jaskaran Singh
la source