First things first:
An empty directory cannot be part of a tree under the Git versioning system.
It simply won't be tracked. But there are scenarios in which "versioning" empty directories can be meaningful, for example:
cache/
or logs/
directories, where we want to provide the folder but .gitignore
its contentsMany users suggest:
README
file or another file with some content in order to make the directory non-empty, or.gitignore
file with a sort of "reverse logic" (i.e. to include all the files) which, at the end, serves the same purpose of approach #1.While both solutions surely work I find them inconsistent with a meaningful approach to Git versioning.
.gitignore
to do a thing (keeping files) that is the very opposite of what it's meant for (excluding files), even though it is possible?Use an empty file called .gitkeep
in order to force the presence of the folder in the versioning system.
Although it may seem not such a big difference:
You use a file that has the single purpose of keeping the folder. You don't put there any info you don't want to put.
For instance, you should use READMEs as, well, READMEs with useful information, not as an excuse to keep the folder.
Separation of concerns is always a good thing, and you can still add a .gitignore
to ignore unwanted files.
Naming it .gitkeep
makes it very clear and straightforward from the filename itself (and also to other developers, which is good for a shared project and one of the core purposes of a Git repository) that this file is
I've seen the .gitkeep
approach adopted by very important frameworks like Laravel, Angular-CLI.