git ready

learn git one commit at a time
by Nick Quaranto

ignoring files

committed 19 Jan 2009

We don’t need Git to version everything in our projects, be it compiled source, files with passwords, or temporary files that editors love to create. Usually keeping stuff out of your VCS’ hands is a task that is hard to manage and annoying to set up. Not with Git! Using the .gitignore file along with some other options, we’re going to learn how to set up per-project and per-user ignores.

The easiest and simplest way is to create a .gitignore file in your project’s root directory. The files you choose to ignore here take affect for all directories in your project, unless if they include their own .gitignore file. This is nice since you have one place to configure ignores unlike SVN’s svn:ignore which must be set on every folder. Also, the file itself can be versioned, which is definitely good.

Here’s a basic .gitignore:

$ cat .gitignore

# Can ignore specific files
.DS_Store

# Use wildcards as well
*~
*.swp

# Can also ignore all directories and files in a directory.
tmp/**/* 

Of course, this could get a lot more complex. You can also add exceptions to ignore rules by starting the line with !. See an example of this at the GitHub guide on ignores.

Two things to keep in mind with ignoring files: First, if a file is already being tracked by Git, adding the file to .gitignore won’t stop Git from tracking it. You’ll need to do git rm --cached <file> to keep the file in your tree and then ignore it. Secondly, empty directories do not get tracked by Git. If you want them to be tracked, they need to have something in them. Usually doing a touch .gitignore is enough to keep the folder tracked.

You can also open up $GIT_DIR/info/exclude ($GIT_DIR is usually your .git folder) and edit that file for project-only ignores. The problem with this is that those changes aren’t checked in, so use this only if you have some personal files that don’t need to be shared with others on the same project.

Your final option with ignoring folders is adding a per-user ignore by setting up a core.excludesfiles option in your config file. You can set up a .gitignore file in your HOME directory that will affect all of your repositories by running this command:

git config --global core.excludesfile ~/.gitignore

Read up on the manpage if you’d like to learn more about how ignores work. As always, if you have other ignore-related tips let us know in the comments.