I understand that a .gitignore file cloaks specified files from Git\'s version control. I have a project (LaTeX) that generates lots of extra files (.auth, .dvi, .pdf, logs,
Had the similar issue as OP but none of top 10 upvoted answer actually worked.
I finally found out the following
Wrong syntax :
*
!bin/script.sh
Correct syntax :
*
!bin
!bin/script.sh
Explanation from gitignore man page :
An optional prefix "!" which negates the pattern; any matching file excluded by a previous pattern will become included again. It is not possible to re-include a file if a parent directory of that file is excluded. Git doesn’t list excluded directories for performance reasons, so any patterns on contained files have no effect, no matter where they are defined.
Which means that "Wrong syntax" above is wrong because bin/script.sh
cannot be reincluded as bin/
is ignored. That's all.
Extended example :
$ tree .
.
├── .gitignore
└── bin
├── ignore.txt
└── sub
└── folder
└── path
├── other.sh
└── script.sh
$ cat .gitignore
*
!.gitignore
!bin
!bin/sub
!bin/sub/folder
!bin/sub/folder/path
!bin/sub/folder/path/script.sh
$ git status --untracked-files --ignored
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
bin/sub/folder/path/script.sh
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
bin/ignore.txt
bin/sub/folder/path/other.sh
nothing added to commit but untracked files present (use "git add" to track)
To ignore some files in a directory, you have to do this in the correct order:
For example, ignore everything in folder "application" except index.php and folder "config" pay attention to the order.
You must negate want you want first.
FAILS
application/*
!application/config/*
!application/index.php
WORKS
!application/config/*
!application/index.php
application/*
The simplest way that I go about this is to force add a file. It will be accounted for in git even if it is buried or nested inside a git-ignored subdirectory tree.
For example:
x64 folder is excluded in .gitignore:
x64/
But you want to include the file myFile.py
located in x64/Release/
directory.
Then you have to:
git add -f x64/Release/myFile.py
You can do this for multiple files of files that match a pattern e.g.
git add -f x64/Release/myFile*.py
and so on.
An optional prefix
!
which negates the pattern; any matching file excluded by a previous pattern will become included again. If a negated pattern matches, this will override lower precedence patterns sources.
# Ignore everything
*
# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...
# ...even if they are in subdirectories
!*/
# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*
I seem to have found something that worked for me which no one else mentioned.
# Ignore everything
*
# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...
# And if you want to include a sub-directory and all sub-directory and files under it, but not all sub-directories
!subdir/
!subdir/**/*
Basically, it seems to negate a sub-directory from being ignored, you have to have two entries, one for the sub-directory itself !subdir/
and then another one which expands to all files and folders under it !subdir/**/*
# ignore these
*
# except foo
!foo