A gitignore file is used to specify files that you want Git to intentionally ignore. Using gitignore has several advantages, the main one advantage being that you can prevent sensitive information, such as database credentials or other configuration files, from being accidentally committed.
The .gitignore
file is usually placed in the working directory, or the root of your project.
For example, let’s assume that we have this basic project structure and a .git
directory has just been initialised within the project.
.git/
app/
.htaccess
App.php
css/
styles.css
ie.css
config/
db.php
.gitignore
.htaccess
index.html
index.php
When running a git status
, Git shows all the files untracked.
$ git status -u
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
.htaccess
app/.htaccess
app/App.php
config/db.php
css/ie.css
css/styles.css
index.html
index.php
Open up the .gitignore
file and add in the .htaccess
, db.php
and index.html
files separated by a new line.
// .gitignore
.htaccess
config/db.php
index.html
Run another git status -u
, and you’ll notice that the index.html, db.php and both .htaccess files are ignored.
Untracked files:
(use "git add ..." to include in what will be committed)
.gitignore
app/App.php
css/ie.css
css/styles.css
index.php
To ignore the .htaccess
in the root directory but keep the one in the app/
directory, add a forward slash before the file name in .gitignore
.
// .gitignore
/.htaccess
config/db.php
index.html
This following is stated in Git’s documentation:
“If the pattern does not contain a slash /, git treats it as a shell glob pattern and checks for a match against the pathname relative to the location of the .gitignore file (relative to the toplevel of the work tree if not from a .gitignore file).”
Whilst this example only ignores 3 files, larger projects may require more information in the gitignore file. For larger gitignore files, you can help keep the file readable by adding comments using a hash, #
.
// .gitignore
# A comment about ignoring base project files
/.htaccess
index.html
# ...and the database credentials!
config/db.php
You can also use an optional prefix, represented by an exclamation mark, !
, which, according to the documentation:
“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.”
This means that if you want to ignore an entire directory and the files/directories within it, but keep one file, you could add the following into .gitignore
.
// .gitignore
# A comment about ignoring base project files
/.htaccess
index.html
# ...and the database credentials!
config/db.php
# Ignore all in app/ but not the .htaccess!
app/*
!app/.htaccess
It should be noted that files already tracked by Git are not affected. So if you had a file into gitignore that has already been committed, you will need to remove the file from Git by running git rm --cached path/to/ignored/file.php
A useful command to show current ignored files is using git status
but passing in the --ignored
argument.
$ git status --ignored