How to configure .gitignore to ignore all files except a certain directory
MWE
In the terminal run:
mkdir mwe
cd mwe
mkdir dir
touch f1.txt f2.pdf dir/f1.txt dir/f2.pdf
git init .
Create a .gitignore
with:
* # ignore all
!dir/ # except this directory
Problem
Git doesn't register this and all files are still ignored:
git status
But, a normal file pattern works:
* # ignore all
!f1.txt # except this file
Question
How do I configure my .gitignore
to ignore all except a certain
directory?
1 answer
The following users marked this post as Works for me:
User | Comment | Date |
---|---|---|
young_souvlaki | (no comment) | Jul 20, 2022 at 23:29 |
From the docs
Example to exclude everything except a specific directory
foo/bar
(note the/*
- without the slash, the wildcard would also exclude everything withinfoo/bar
):$ cat .gitignore # exclude everything except directory foo/bar /* !/foo /foo/* !/foo/bar
Just do
/*
!/dir
Why this works (and yours doesn't)
When you exclude *
, you end up excluding everything, directories and files alike. When you un-exclude dir
, the files inside aren't un-excluded as well. This is why it doesn't appear to do anything. You can actually fix this by first un-excluding dir
and then un-excluding everything in it like this:
*
!/dir
!/dir/**/*
By using /*
though, it doesn't exclude everything, but only the top-level stuff. The files inside technically weren't excluded, but as long as the directory the files are in is excluded, the files won't be included.
Therefore, when you un-exclude dir
, the files within (which hadn't been excluded) are included without a problem.
1 comment thread