Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gitignore directory exception not working

Tags:

git

gitignore

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

like image 488
Marty Wallace Avatar asked May 21 '13 20:05

Marty Wallace


People also ask

Why is my .gitignore file not working?

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.

How do I ignore a folder in Gitignore?

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.

Why is my file not being ignored in Gitignore?

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.

What is exclamation mark in Gitignore?

An exclamation mark can be used to match any character except one from the specified set.


2 Answers

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/
like image 53
CB Bailey Avatar answered Sep 19 '22 18:09

CB Bailey


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/
like image 30
tanius Avatar answered Sep 21 '22 18:09

tanius