I\'ve recently started using Git and am having trouble with just one thing. How can I track directories without tracking their contents?
For example the site I\'m wo
Git doesn't track directories, it tracks files, so to acheive this you need to track at least one file. So assuming your .gitignore
file looks something like this:
upload/*
You can do this:
$ touch upload/.placeholder
$ git add -f upload/.placeholder
If you forget the -f
you'll see:
$ git add upload/.placeholder The following paths are ignored by one of your .gitignore files: upload Use -f if you really want to add them. fatal: no files added
Then when you do git status
you'll see:
# On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached ..." to unstage) # # new file: upload/.placeholder #
Obviously you can then do:
$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder
I wrote about this here.
Add a .gitignore within the directory.
Best answerd I've found is to include a .gitignore file in your upload folder with this content
# Ignore everything in this directory
*
# Except this file
!.gitignore
Here you have How can I add an empty directory to a Git repository?
In order to track only directories but not the files, I did the following. Thanks to the @PeterFarmer's comment on git tracking only files, I've been able to keep all directories excluding the files as described in below.
# exclude everything in every folder
/data/**/*.*
# include only .gitkeep files
!/data/**/*.gitkeep
Adding this to the .gitignore file will do the work. The following is my folder structure.
data/
├── processed
│ ├── dataset1.csv
│ └── dataset2.csv
├── raw
│ ├── raw_dataset1.json
└── test
├── subfolder
│ └── dataset2.csv
└── reviews.csv
When I do git add . && git status
, git only recognizes folders, but not files.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: .gitignore
new file: data/processed/.gitkeep
new file: data/raw/.gitkeep
new file: data/test/.gitkeep
new file: data/test/subfolder/.gitkeep
Keep in mind that the following for your .gitignore files:
Prepending slash looks only for the root directory.
/dir
Double asterisk looks for zero or more directories.
/**/
The best solution so far:
1) Create a .gitignore file
2) Write inside:
*
*/
!.gitignore
3) Add the .gitignore file to the folder that you want.
Source: https://stackoverflow.com/a/5581995/2958543