Search code examples
gitgit-commit

Track file inside ignored directory


Some time ago I set up my .gitignore file to not track a folder my_folder with:

my_folder/

Now I want to track only a given file inside said folder, named my_file.md. After making .gitignore look like this:

my_folder/
!my_folder/my_file.md

and checking:

git status

the file does not appear as a change to be committed.

What am I doing wrong?


Add

I tried changing my .gitignore file to:

my_folder/*
!my_folder/my_file.md

as advised but the file is still not showing up as a change to commit after a git status. Do I need to reset something?


Add 2

Attempting to add the file with git add my_folder/my_file.md returns:

The following paths are ignored by one of your .gitignore files:
my_folder/my_file.md
Use -f if you really want to add them.
fatal: no files added

The command git check-ignore -v my_folder/my_file.md gives:

.gitignore:1:my_folder/*    my_folder/my_file.md

Solution

  • To add to ".gitignore exclude folder but include specific subfolder", one good way to debug those .gitignore file is to use git check-ignore (Git 1.8.4+):

    git check-ignore -v my_folder/my_file.md
    

    You would see it is still ignored because of the my_folder/ rule.

    That is because it is not possible to re-include a file if a parent directory of that file is excluded.(*)
    (*: unless certain conditions are met in git 2.?+, see below)

    That is why ignoring the files within that folder (my_folder/*, instead of the folder itself) allows you to exclude one.

    Of course, you can force adding a file ignored (git add -f my_folder/my_file.md), but that is not the point of this answer.
    The point is to explain why adding !my_folder/my_file.md in .gitignore doesn't work with git 2.6 or less.


    Note that with git 2.9.x/2.10 (mid 2016?), it might be possible to re-include a file if a parent directory of that file is excluded if there is no wildcard in the path re-included.

    Nguyễn Thái Ngọc Duy (pclouds) is trying to add this feature:

    So here, with git 2.8+, this would work:

    /my_folder
    !my_folder/my_file.md