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


J'ai l'application de dossier / que j'ajoute au .gitignore. Dans le dossier / application est le dossier application / language / gr. Comment puis-je inclure ce dossier? J'ai essayé ça

application/
!application/language/gr/

sans chance ...


657
2018-04-03 22:48


origine


Réponses:


Si vous excluez application/, alors tout ce qui est en dessous sera toujours exclu (même si un motif d'exclusion négatif plus tardif ("unignore") pourrait correspondre à quelque chose sous application/).

Pour faire ce que vous voulez, vous devez "ignorer" tous les répertoires parents de tout ce que vous voulez "ignorer". Habituellement, vous finissez par écrire des règles pour cette situation par deux: ignorer 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/

Remarque
Le trailing / * est significatif:

  • Le modèle dir / exclut un répertoire nommé dir et (implicitement) tout sous ce répertoire.
    Avec dir /, Git ne regardera jamais rien sous dir, et n'appliquera donc jamais aucun des motifs "un-exclude" à quelque chose sous dir.
  • Le motif dir / * ne dit rien sur dir lui-même; ça exclut tout sous dir. Avec dir / *, Git traitera le contenu direct de dir, donnant aux autres patterns une chance de "dé-exclure" un peu du contenu (! Dir / sub /).

1100
2018-04-04 05:22



Commit 59856de de Karsten Blees (kblees) pour Git 1.9 / 2.0 (Q1 2014) clarifie ce cas:

gitignore.txt: clarifier la nature récursive des annuaires exclus

Un préfixe optionnel "!"qui annule le motif, tout fichier correspondant exclu par un motif précédent sera à nouveau inclus.

Il n'est pas possible de ré-inclure un fichier si un répertoire parent de ce fichier est exclu. (*)
  (*: sauf si certaines conditions sont remplies dans git 2.8+, voir ci-dessous)
  Git ne répertorie pas les répertoires exclus pour des raisons de performances. Par conséquent, les modèles de fichiers contenus n'ont aucun effet, quel que soit l'endroit où ils sont définis.

Mettez un antislash ("\") devant le premier"!"pour des motifs qui commencent par un littéral"!", par exemple, "\!important!.txt".

Exemple pour exclure tout sauf un répertoire spécifique foo/bar (noter la /* - sans la barre oblique, le caractère générique exclut également tout ce qui se trouve dans foo/bar):

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

Mise à jour février / mars 2016:

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

Nguyễn Thái Ngọc Duy (pclouds) essaie d'ajouter cette fonctionnalité:

Donc, avec git 2.9+, cela aurait pu fonctionner, mais a finalement été annulé:

application/
!application/language/gr/

100
2017-12-18 08:10



La réponse de @Chris Johnsen est excellente, mais avec une version plus récente de Git (1.8.2 ou version ultérieure), il existe un modèle à double astérisque que vous pouvez utiliser pour obtenir une solution un peu plus rapide:

# 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 à "ignorer" le répertoire parent du sous-dossier que vous voulez suivre.


Avec Git 2.17.0 (Je ne sais pas si tôt avant cette version, peut-être revenir à 1.8.2), en utilisant le ** modèle combiné avec exclues pour chaque sous-répertoire menant à votre fichier (s) fonctionne. 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

36
2017-09-09 16:30



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

La seule façon de faire fonctionner ça sur ma machine était de faire comme ça:

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

Remarquez 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 l'épeler.

Ceci est tiré 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/**/*

Rien de tout cela n'a fonctionné pour moi non plus. Beaucoup de sentiers et d'erreurs!


14
2018-04-29 23:37



Donc, puisque de nombreux programmeurs utilisent des nœuds. 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
2017-09-01 21:19



Juste un autre exemple de marcher dans 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
2017-09-14 14:53



J'ai trouvé seulement ça réellement travaux.

**/node_modules/*
!**/node_modules/keep-dir

3
2018-02-16 21:53