I have a file structure similar to the one below:
foo/bar.foo
node_modules/foo/bar.json
node_modules/foo/bar/foo.bar
What I want to do is ignore all the files inside the node_modules
folder except the json
files so that I end up with the following file structure in my repo:
foo/bar.foo
node_modules/foo/bar.json
I tried to find a simple way to do that but I'm not quite there yet.
Here's what I came up with in my .gitignore
:
# ignore everything inside node_modules
node_modules/*
# But descend into directories
!node_modules/**/*.json
What's the most elegant way to achieve the desired result?
P.S. I have no idea what I'm doing.
Ok so I finally found a solution. Here's what did the trick:
The issue was that by doing
node_modules/*
, it would not just ignore files but also folders.And as the git doc says:
So instead I did
node_modules/**/*.*
which only exclude files and not folders.That way,
!node_modules/**/*.json
is actually able to white list thejson
files.In the gitignore documentation, they state:
This provides intuition for why your rule is failing. You can manually add the missing json files with some xargs magic. You'd have to run this whenever adding new packages, but once they're tracked everything will work.
I tested with Git
2.18.0
and confirmed that files in your ignored directory work fine after being added in this way. The-f
parameter above is required for deeper paths that were excluded by your.gitignore
rules.You must first not ignore (exclude) the subfolders of your ignored directory.
Do use
git check-ignore -v -- afile
to check which rule would still be ignoring your file.And make sure those files were not added to the index (
git rm --cached -r node_modules
)