Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Correctly ignore all files recursively under a specific folder except for a specific file type

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.

like image 677
nawfal Avatar asked Jul 23 '13 14:07

nawfal


People also ask

How do I ignore a specific file type in Git?

If you want to ignore a file that you've committed in the past, you'll need to delete the file from your repository and then add a . gitignore rule for it. Using the --cached option with git rm means that the file will be deleted from your repository, but will remain in your working directory as an ignored file.


2 Answers

@SimonBuchan is correct.

Since git 1.8.2, Resources/** !Resources/**/*.foo works.

like image 56
Jim G. Avatar answered Sep 21 '22 21:09

Jim G.


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.

like image 23
Ben Martin Avatar answered Sep 21 '22 21:09

Ben Martin