web-dev-qa-db-fra.com

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

Mon problème est que j'ai un tas de sites Web WordPress dans mon dépôt git, dont je veux commettre sélectivement uniquement le contenu de mes dossiers themes, 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 tout ignorer MAIS un certain chemin de dossier?

root (git repo)
-/wordpress
- -/(Site WordPress 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 aussi 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 dossiers themes.

110
Yarin

Voici comment je l'ai fait - vous devez essentiellement emprunter les chemins, vous ne pouvez pas utiliser de 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 que 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.

C'est seulement comment cela a fonctionné pour moi. Si quelqu'un veut offrir une explication plus éclairée par tous les moyens.

En outre, ces réponses utiles: 
comment-faire-nier-patterns-work-in-gitignore
comment-faire-gitignore-exclusion-règles-en fait de travail


NOTE: J'ai essayé d'utiliser des 'globs' à double joker, mais selon this , cette fonctionnalité dépend du système et ne fonctionne pas sur mon mac

N'a pas marché:

!**/wp-content/themes/
!**/wp-content/themes/**
101
Yarin

J'ai essayé ce qui précède et ils n'ont pas si bien fonctionné. une approche BEAUCOUP mieux est comme suit à partir de là: 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/
74
dwenaus

modifier la première ligne

*

changez le en

/*
15
吴毅凡

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

9
dappawit

Essayez ces réponses:

Faire 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 puis-je 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 racine bin:

/*
/*/
!/bin/

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

8
irritate

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

*

!.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
3
cabgfx

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

Pour moi, ça marche 

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt
3
Matias Seguel

tard dans la soirée mais voici ce que j'utilise pour une profondeur inconnue (la solution acceptée requiert une profondeur connue)

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

ainsi, tout ce qui est contenu dans wp-content n'est pas ignoré.

3
Jubair

Disons que vous avez une structure de répertoire comme celle-ci:

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

Lorsque vous voulez n'autoriser que les sites/tous/fichiers/privé/newspilot et sites/paramètre/default/files/private/newspilot, vous pouvez, au début, essayer ceci:

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

C'est faux! La difficulté avec gitignore est que vous devez d’abord autoriser l’inclusion du répertoire parent ("privé"), avant de permettre l’inclusion de son répertoire enfant ("newspilot") 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/

3
Peeter Kokk

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

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

Dans cet exemple, vous avez une configuration de site Web à ./ dans laquelle se trouvent votre dossier .git et votre fichier .gitignore, ainsi qu'une configuration d'installation de WordPress dans ./wordpress. Pour ignorer correctement tout ce qui se trouve dans le répertoire ./wordpressà part le répertoire du thème lui-même (wordpress/wp-content/themes/my-theme), vous devez ignorer et autoriser de manière récursive chaque répertoire et le laisser accéder 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

Le motif d'ignorer avec un caractère générique et d'autoriser (ou d'ignorer "en dehors de") le répertoire lui-même permet à Git de commencer par regarder à l'intérieur du répertoire avant de tout ignorer. Nous disons ensuite à Git de tout ignorer "en dehors" du répertoire que nous avons spécifié. Voici la même syntaxe, mais dans l'ordre dans lequel Git la considère:

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.

3
Oliver Tappin

Vous pouvez essayer ceci:

!**/themes/*

:

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

Voici ma solution, qui suppose une extraction dans 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, conformément à 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 staging et production dans le référentiel /opt/checkout/repo.git/ nu. Le hook post-receive suivant (dans /opt/checkout/repo.git/hooks/post-receive) extraira ensuite 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

1
Waddles

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 les fichiers ou dossiers spécifiques

macOS sierra

1
Gaurav Raghuvanshy

Je suis toujours coincé quelque part à ce sujet, même après être revenu plusieurs fois sur cette question. J'ai mis au point un processus détaillé pour le faire étape par étape:

Commencez par utiliser git add pour ajouter le contenu actuel. 

Il montrera les fichiers pertinents ajoutés à l'index pendant que tous les autres ne sont pas encore 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 fichier temporaire DUMMY.TXT 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 maintenant est de construire les règles de telle sorte que ce DUMMY.TXT soit le seul à apparaître 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 doivent être tous partis, seuls les fichiers indexés doivent montrer:

$ 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 ne contiendront que le contenu de wp-content

$ 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és-ignorer !/wp-content/themes

/*
!/wp-content

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

Maintenant, les fichiers non suivis seront encore réduits à 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 le fichier factice soit le seul à afficher encore 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
1
laggingreflex

Une autre solution facile:

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

.gitignore , content is:

# 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 if .gitignore se trouve dans le répertoire root wordpress

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

Conclusion :

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

MAIS

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

0
Arthur Bouchard

Je suis dans le même bateau, essayant de gérer un tas de sites Wordpress sous un même dépôt. Ma structure de répertoire 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 juste suivre les éléments dans le dossier app/public 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

ce 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 c’est tout pour moi. Donc voici ce que j'ai fini par utiliser:

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

Cela a effectivement ignoré tout ce qui se trouvait dans le dossier du site lors de la capture de tout ce qui se trouvait dans le dossier app/public de tout site créé à la racine.

Notez qu’il n’ignorera pas les fichiers de la racine, mais uniquement les répertoires :)

J'espère que cela t'aides.

0
Henry

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

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

Explication ligne par ligne:

  1. Ignorer tous les répertoiresà la racine.
  2. Ignorer tous les fichiers avec des extensions à la racine.
  3. Autoriser .gitignore lui-même (et potentiellement .gitattributes).
  4. Autoriser le répertoire souhaité avec tous les sous-répertoires

[1] Limitations (à ma connaissance):

  1. Il n'ignore pas les fichiers sans extension à la racine (et ajouter /* romprait tout le schéma).
  2. Le répertoire que vous souhaitez inclure à la ligne 4 (wordpress dans ce cas) ne peut pas avoir . dans le nom (par exemple, wordpress.1 ne fonctionnerait pas). S'il possède 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
0
Dimagog