I have seen similar questions (1, 2 and 3), but I don't get a proper solution from them.
I need to ignore all files under a particular folder except for a specific file type. The folder is a subdirectory for the root path. Let me name the folder Resources
. Since I don't want to complicate things, let me ignore files under all folders named Resources
wherever it is.
This is the most common solution (in all the duplicate questions)
# Ignore everything
*
# Don't ignore directories, so we can recurse into them
!*/
# Don't ignore .gitignore
!.gitignore
# Now exclude our type
!*.foo
The problem with this solution is that it stops tracking newly added files (since *
ignores all files). I don't want to keep excluding each and every file type. I want normal behaviour where if any new file is added, git status
shows it.
I finally got a solution here. The solution is to add another .gitignore
file in Resources
folder. This works correctly.
Can I achieve the same with one ignore file? I find having many ignore files in different directories a bit clunky.
This is what I'm trying to achieve:
# Ignore everything under Resources folder, not elsewhere
Resources
# Don't ignore directories, so we can recurse into them
!*Resources/
# Now exclude our type
!*.foo
But this gives the opposite output. It ignores *.foo
types and tracks other files.
This question is related to
git
version-control
directory
gitignore
subdirectory
This might look stupid, but check if you haven't already added the folder/files you are trying to ignore to the index before. If you did, it does not matter what you put in your .gitignore file, the folders/files will still be staged.
Either I'm doing it wrongly, or the accepted answer does not work anymore with the current git.
I have actually found the proper solution and posted it under almost the same question here. For more details head there.
Solution:
# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo
The best answer is to add a Resources/.gitignore file under Resources containing:
# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo
If you are unwilling or unable to add that .gitignore file, there is an inelegant solution:
# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo
You will need to edit that pattern if you add directories deeper than specified.
Source: Stackoverflow.com