I have the following folder structure:
public
media
catalog
product
category
private
tmp
var
test
I want to gitignore everything in the media
directory except for catalog/category
and private
My gitignore I am trying is:
public/media/*
!public/media/catalog/category/
!public/media/private
But it doesn't work. Any new files added to the category
or private
directories are not available to add.
I could just git add force but I would like this done through the gitignore if possible
Check the file you're ignoring Take a good look at your structure, and make sure you're trying to ignore the file that isn't already committed to your repository. If it is, remove the file from the repository and try again. This should fix the Gitignore not working issue.
If you want to maintain a folder and not the files inside it, just put a ". gitignore" file in the folder with "*" as the content. This file will make Git ignore all content from the repository.
gitignore ignores only untracked files. Your files are marked as modified - meaning they were committed in the past, and git now tracks them. To ignore them, you first need to delete them, git rm them, commit and then ignore them.
An exclamation mark can be used to match any character except one from the specified set.
It's usually simplest to put just a .gitignore
at the level where it starts to matter. (This also helps if you ever split a repository or move directories around.) In this case you need to ignore everything except catalog
and private
in the public/media
folder so in public/media/.gitignore
put:
/*
!/catalog/
!/private/
and in public/media/catalog/.gitignore
put:
/*
!/category/
It's important (and the reason that your rules are not working) not to ignore the public/media/catalog
directory itself, as otherwise everything in it will be ignored, even if you didn't want to ignore a specific part of its contents.
Of course, you can combine this into a single ignore at the public/media
level if you like:
/*
!/catalog/
!/private/
/catalog/*
!/catalog/category/
Solution with a single .gitignore
file in the repo root directory
You tried to use one .gitignore
file at the repository's root level. Like you, I usually also centralize all ignores like this to keep things tidy. In this case it is difficult though, because "It is not possible to re-include a file if a parent directory of that file is excluded" [source].
My ugly solution for this restriction, which I also explore in my related answers here and here: re-include all parent directories along the path before re-including your desired file, while keeping other files in these parent directories out by re-excluding them.
With that, your .gitignore
patterns would be:
public/media/**
!public/media/private
!public/media/catalog/
public/media/catalog/**
!public/media/catalog/category/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With