.gitignore exclut le dossier mais inclut un sous-dossier spécifique

j'ai le dossier application/ que j'ajoute à la .gitignore. À l'intérieur de l'application/ est le dossier application/langue/gr. Comment puis-je inclure ce dossier? J'ai essayé ce

application/
!application/language/gr/

sans succès...

680
demandé sur Matt 2011-04-04 02:48:48

11 réponses

si vous excluez application/ , alors tout ce qu'il contient sera toujours exclu (même si un modèle d'exclusion négatif ultérieur ("unignore") pourrait correspondre à quelque chose sous application/ ).

pour faire ce que vous voulez, vous devez" unignore "chaque répertoire parent de tout ce que vous voulez"unignore". Habituellement, vous finissez par écrire des règles pour cette situation en paires: ignorez tout dans un répertoire, mais pas un certain sous-répertoire.

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

Note

L'arrière /* est significatif:

  • Le modèle dir/ exclut un répertoire nommé dir et (implicitement) le tout sous elle.

    Avec dir/ , Git ne considérera jamais rien sous dir , et donc n'appliquera jamais aucun des modèles" un-exclu "à quelque chose sous dir .
  • le le motif dir/* ne dit rien au sujet de dir lui-même; il exclut simplement tout sous dir . Avec dir/* , Git va traiter le contenu direct de dir , donnant à d'autres motifs une chance de" dé-exclure "un peu du contenu ( !dir/sub/ ).
1144
répondu Chris Johnsen 2018-08-24 21:24:49

Commettre 59856de à partir de Karsten Blees (kblees) pour Git 1.9/2.0 (T1 2014) précise que:

gitignore.txt : clarifier le caractère récursif des répertoires exclus

un préfixe facultatif " ! " qui annule le modèle; tout fichier de correspondance exclu par un modèle précédent sera de nouveau inclus.

Il n'est pas possible de ré-inclure un fichier si un répertoire parent du fichier est exclu. ( * )

( * : à moins que certaines conditions ne soient remplies en git 2.8+, voir ci-dessous)

Git ne Liste pas les répertoires exclus pour des raisons de performance, de sorte que les motifs sur les fichiers contenus n'ont aucun effet, peu importe où ils sont définis.

mettre un antislash (" \ ") dans avant de la première " ! "pour les modèles qui commencent par un caractère" ! ", par exemple", \!important!.txt ".

exemple pour exclure tout sauf un répertoire spécifique foo/bar (notez le /* - sans la barre oblique, le Joker exclurait aussi tout dans foo/bar ):

 --------------------------------------------------------------
     $ cat .gitignore
     # exclude everything except directory foo/bar
     /*
     !/foo
     /foo/*
     !/foo/bar
 --------------------------------------------------------------

Mise À Jour Février/Mars 2016:

noter qu'avec git 2.9.x/2.10 (mi-2016?), il pourrait être possible de re-inclure un fichier si un répertoire parent de ce fichier est exclu s'il n'y a pas de Joker dans le chemin re-inclus .

Nguy "Nguy" Thái ng Duc Duy ( pclouds ) essaie d'ajouter cette caractéristique:

donc avec git 2.9+, cela aurait pu fonctionner, mais a finalement été inversé:

application/
!application/language/gr/
107
répondu VonC 2016-11-28 19:40:12

la réponse de @Chris Johnsen est excellente, mais avec une nouvelle version de Git (1.8.2 ou plus tard), il y a un double motif d'astérisque que vous pouvez utiliser pour un peu plus de solution en sténo:

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

de cette façon vous n'avez pas à" unignore " le répertoire parent du sous-dossier que vous voulez suivre.


Avec Git 2.17.0 (Pas sûr de la façon précoce, avant cette version. Peut - être au 1.8.2), en utilisant le modèle ** combiné avec exclut pour chaque sous-répertoire jusqu'à votre fichier(s) de travaux. Par exemple:

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder
42
répondu rpyzh 2018-04-12 16:28:49

il y a un tas de questions similaires à ce sujet, donc je vais poster ce que j'ai écrit avant:

la seule façon de faire fonctionner ma machine était de le faire de cette façon:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories:
!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 voulez inclure. Donc si j'ai des sous-répertoires 5 en profondeur sous les thèmes, j'ai encore besoin de le préciser.

c'est du commentaire de @Yarin ici: https://stackoverflow.com/a/5250314/1696153

ce sont des sujets utiles:

j'ai aussi essayé

*
*/*
**/**

et **/wp-content/themes/**

ou /wp-content/themes/**/*

ça n'a pas marché pour moi non plus. Beaucoup de trail et de l'erreur!

14
répondu Katie S 2017-05-23 11:55:11

Je n'ai trouvé que ce en fait fonctionne.

**/node_modules/*
!**/node_modules/keep-dir
5
répondu Steve Kling 2017-02-16 21:53:07

donc, puisque beaucoup de programmeurs utilisent le noeud . le cas d'utilisation qui répond à cette question Est d'exclure node_modules sauf un module module-a par exemple:

!node_modules/

node_modules/*
!node_modules/module-a/
4
répondu Abdennour TOUMI 2016-09-01 21:19:56

juste un autre exemple de marche le long de la structure du répertoire pour obtenir exactement ce que vous voulez. Note: je n'ai pas exclu Library/ mais Library/**/*

# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme

> git add Library

> git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
    new file:   Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
    new file:   Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings
3
répondu Adrian Dunston 2016-09-14 14:53:28

spécialement pour les anciennes versions de Git, la plupart des suggestions ne fonctionneront pas très bien. Si c'est le cas, je mettrais un séparé .gitignore dans le répertoire où je veux que le contenu soit inclus indépendamment des autres paramètres et permettre là ce qui est nécessaire.

par exemple: /.gitignore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

donc tout dans /dependency_files (Pair .les fichiers dll) sont inclus l'amende juste.

3
répondu Breit 2017-06-23 08:59:40

j'ai trouvé un cas similaire ici, où dans laravel par défaut, .gitignore ignore tout en utilisant Astérix, puis l'emporte sur le répertoire public.

*
!public
!.gitignore

ce n'est pas suffisant si vous rencontrez le scénario OP.

si vous voulez propager un sous-dossier spécifique de public , dites par exemple dans votre répertoire public/products que vous voulez inclure des fichiers qui sont un sous-dossier profond par exemple pour inclure public/products/a/b.jpg ils ne seront pas détectés correctement, même si vous les ajoutez spécifiquement comme ce !/public/products , !public/products/* , etc..

la solution est de s'assurer que vous ajoutez une entrée pour chaque niveau de chemin comme ceci pour les surpasser tous.

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*
3
répondu blamb 2017-10-21 01:49:33

dans WordPress, cela m'a aidé:

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**
1
répondu T.Todua 2018-05-21 15:44:57

j'ai voulu suivre la production jQuery JS files et cela a fonctionné:

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*
-1
répondu Indrek Ruubel 2018-03-30 06:58:28