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

Mon problème est que j’ai un tas de sites Web WordPress dans mon repository git, dont je veux commettre de manière sélective uniquement le contenu de mes dossiers themes , tout en ignorant le rest des fichiers redondants trouvés dans WordPress.

J’ai utilisé des fichiers .gitignore pour ignorer les types de fichiers auparavant, mais peut-il être utilisé dans l’autre sens, c’est-à-dire ignorer tout, mais un chemin de dossier spécifique?

racine (repo git)
– / 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 aussi essayé les variantes suivantes:

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

Aucun d’entre eux ne lit les dossiers de mes themes .

Voici comment je l’ai fait – vous devez essentiellement parcourir les chemins, vous ne pouvez pas utiliser 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 explicitement autoriser le contenu pour chaque niveau que vous souhaitez inclure. Donc, si j’ai des sous-répertoires 5 sous les thèmes, je dois toujours préciser.

C’est seulement comme ça que ça a fonctionné pour moi. Si quelqu’un se soucie d’offrir une explication plus éclairée par tous les moyens.

Aussi, ces réponses utiles:
comment-faire-négation-modèles-de-travail-dans-gitignore
comment-faire-gitignore-règles d’exclusion-réellement-travail


NOTE: J’ai essayé d’utiliser des «globs» à double caractère générique, mais selon cette fonctionnalité, celle-ci dépend du système et ne fonctionne pas sur mon Mac:

N’a pas fonctionné:

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

J’ai essayé ce qui précède et ils n’ont pas bien fonctionné. une approche BEAUCOUP meilleure est la suivante: 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/ 

modifier la première ligne

 * 

changer pour

 /* 

Si vous préfixez un motif avec un point d’exclamation ( ! ), Il annule tout motif précédent qui l’a exclu. Donc, probablement, vous pourriez tout ignorer, puis ne permettre que ce que vous voulez en utilisant ce modèle.

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 puis-je dire à Git d’ignorer tout sauf un sous-répertoire?

Cela ignore les fichiers racine et les répertoires racine, puis ignore 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.

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 

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 à ./ où se trouvent votre dossier .gitignore et .gitignore fichier .gitignore et une installation d’installation de WordPress dans ./wordpress . Pour ignorer correctement tout ce qui se trouve sous le répertoire ./wordpress dehors du répertoire du thème lui-même ( wordpress/wp-content/themes/my-theme ), vous devrez ignorer et autoriser chaque répertoire jusqu’à ce que le 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 caractère générique et de permettre (ou d’ignorer ‘en dehors de’) le répertoire lui-même permet à Git de regarder d’abord dans le répertoire avant d’ignorer tout ce qu’il contient. Nous disons ensuite à Git d’ignorer tout ce qui est en dehors du répertoire que nous avons spécifié. Voici la même syntaxe, mais dans l’ordre de la façon dont Git la 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 

J’espère que cela aidera quelqu’un à mieux comprendre la nécessité de la méthode récursive.

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

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

Lorsque vous souhaitez autoriser uniquement les sites / tous / fichiers / private / newspilot et sites / default / files / private / newspilot , vous pouvez au début essayer ceci:

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

C’est faux! La difficulté de gitignore est que vous devez d’abord autoriser l’inclusion du répertoire parent (“private”) avant de pouvoir inclure 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/

tard à 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 ce qui est sous wp-content n’est pas ignoré.

J’avais besoin d’ignorer tout sauf un dossier avec des sous-répertoires.

Pour moi, cela fonctionne

 # Ignore everything /* # Not these directories !folder/ # Not these files !.gitignore !.env !file.txt 

Je suis toujours coincé quelque part, même après être revenu à cette question à plusieurs resockets. J’ai mis au point un processus détaillé pour le faire pas à pas:

Utilisez d’abord git add pour append le contenu réel.

Il affichera les fichiers pertinents ajoutés à l’index alors que tous les autres ne seront pas suivis. Cela permet de construire .gitignore pas à pas.

 $ 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 objective maintenant est de construire les règles de telle sorte que ce DUMMY.TXT soit le seul encore à apparaître comme non suivi lorsque nous aurons terminé.

Commencez à append les règles:

.gitignore

 /* 

Le premier est de tout ignorer. Les fichiers non suivis doivent être tous partis, seuls les fichiers indexés doivent apparaître:

 $ 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 apparaîtront à nouveau, mais uniquement avec le 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/ .. 

Ignorez tout dans le premier répertoire /wp-content/* et désélectionnez !/wp-content/themes

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

Les fichiers non suivis se limitent désormais à 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 fictif soit le seul à ne pas être répertorié:

 /* !/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 

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

Vous pouvez essayer ceci:

 !**/themes/* 

:

  • ! : negate ignore (include)
  • **: toute arborescence de répertoires (récursivité) afin de ne pas avoir à spécifier votre chemin de dossier
  • thèmes: votre dossier à inclure (peut être n’importe quoi)
  • *: tout fichier dans ce dossier, vous pouvez inclure tous les sous-dossiers avec ** et au lieu d’inclure un fichier (*), vous pouvez être spécifique * .css, * .xy

Je suis dans le même bateau en essayant de gérer un groupe de sites WordPress sous un seul repo. 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 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 cela a fait l’affaire pour moi. Donc c’est 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 dossier app/public pour tout site que je crée dans la racine.

Notez qu’il n’ignorera pas les fichiers dans la racine, juste les répertoires 🙂

J’espère que cela t’aides.