Properly managing your .gitignore file

There's not a single month where I don't have to explain this. I thought it'd be a good opportunity to write about this .gitignore
file so everyone is up to date on this magic file.
The purpose of .gitignore
The .gitignore
file is meant to be a list of files that Git should not track. It resides at the root directory of your repository. It can be a list of file path relative to the repository, or a list of wildcard. The file format and location is fully documented in Git documentation.
For example, this is a valid content for a .gitignore
file:
foo
bar/*
When you're using Git commands such as git add
, all the files matching what's listed in .gitignore
are ignored. That makes sure you don't commit a file that should not be there by mistake. In the example above, any file in the bar
directory or any file named foo
will be completely ignored by all Git commands.
Awesome!
What's the problem with it?
Soon, developers realize that their directory is cluttered with temporary files. It might be from their build system, their editors or some test files they wrote.
So what do they do? They add those files to .gitignore
for their project. You end up with a .gitignore
file that contains entries like:
*~
.vscode
*.DS_Store
.idea
With that, you're sure to ignore backup files from vim, folders from MacOS and temporary files from Visual Studio code, etc.

Don't do this. Not everybody uses your editor or favorite pet tool, and nobody cares. The repository you're working in is shared with a lot of others developers. Sending pull requests to just add this kind of entry to ignore files generated by your pet editor is wrong and annoying.
Wait, how do I ignore my editor files then?
If you read through Git documentation, the answer lies there: Git has a global ignore file that works for EVERY repository on your system. No need to hack each repository. By default, it's in ~/.config/git/ignore
. Here's mine:
.#*
*.swp
.DS_Store
.dir-locals.el
.dir-locals-2.el
That's enough to ignore my editors and OS files in all my repositories so I don't git add
wrong files by mistake. You can tweak this global file location by changing by tweaking core.excludesFile
in your Git configuration.
So what should I put in .gitignore?
You should put in .gitignore
all files and patterns that are generated by the build system of your project, or any file that it might output while running.
For example, for a Python project, it's common to have this:
*.pyc
__pycache__
With this, it makes sure that nobody is committing compiled Python files.

Thanks for reading through this. I hope you'll write better .gitignore
files in the future. 🤞
