.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...
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.
Avecdir/
, Git ne considérera jamais rien sousdir
, et donc n'appliquera jamais aucun des modèles" un-exclu "à quelque chose sousdir
. - le le motif
dir/*
ne dit rien au sujet dedir
lui-même; il exclut simplement tout sousdir
. Avecdir/*
, Git va traiter le contenu direct dedir
, donnant à d'autres motifs une chance de" dé-exclure "un peu du contenu (!dir/sub/
).
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 dansfoo/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:
- commettre 506d8f1 pour git v2.7.0, est revenue en commettre 76b620d git v2.8.0-rc0
- commit 5e57f9c git v2.8.0-rc0,... revenue(! dans commettre 5cee3493 git 2.8.0.
donc avec git 2.9+, cela aurait pu fonctionner, mais a finalement été inversé:
application/
!application/language/gr/
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
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:
- Comment faire niée habitudes de travail .gitignore?
- Comment faire gitignore l'exclusion des règles de fonctionnement?
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!
Je n'ai trouvé que ce en fait fonctionne.
**/node_modules/*
!**/node_modules/keep-dir
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/
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
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.
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/*/*
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/**
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/*