Skip to content
Julien DanjouJulien Danjou
September 4, 2025 · 4 min read

Stop Abusing .gitignore

Stop Abusing .gitignore

.gitignore is one of Git’s most abused features. Here’s what it’s actually for, why you shouldn’t commit your editor junk into it, and how to use a global ignore file instead.

There isn’t a single month where I don’t have to explain this. So let’s do it once and for all: .gitignore is a great feature, but people keep using it wrong.

🤓 What’s the Purpose of .gitignore?

The .gitignore file tells Git which files it should not track. It usually lives at the root of your repository, and it can list specific file paths or use wildcards.

Example:

foo
bar/*

In this case:

  • Any file named foo will be ignored.
  • Everything under the bar/ directory will be ignored.

That way, you don’t accidentally git add files that don’t belong in your repo.

Pretty neat.

😅 Where People Go Wrong

Here’s what happens: your working directory gets messy. Build artifacts, editor backups, OS junk files…

So you add them to .gitignore:

*~
.vscode
*.DS_Store
.idea

Problem solved? Not really.

The repo is a shared space. Your editor isn’t my editor. My OS isn’t your OS. Nobody wants PRs that just add “ignore VSCode stuff” or “ignore my Vim backups.”

It clutters history, helps nobody, and frustrates maintainers.

🙄 So How Do I Ignore My Local Junk?

Git has you covered: a global ignore file.

By default: ~/.config/git/ignore

Here’s mine:

.#*
*.swp
.DS_Store
.dir-locals.el

This keeps Vim swaps, Emacs configs, and macOS clutter out of every repo I work on.

You can configure the file location with:

git config --global core.excludesFile ~/.config/git/ignore

Now your junk stays out of everyone else’s history.

✅ What Belongs in .gitignore?

The only things that should live in .gitignore are project-generated files:

  • Build artifacts
  • Compiled files
  • Cache directories

For example, in Python projects:

*.pyc
__pycache__/

That way, the ignore file reflects the project’s needs, not every contributor’s local setup.

💡 Takeaway

  • .gitignore is for project artifacts.
  • Use a global ignore for your editor/OS noise.
  • Stop sending PRs that add your pet editor’s folders — nobody cares. 😉

Follow these rules, and your repositories will stay cleaner, your teammates happier, and your commit history will be free of irrelevant junk.

Merge Queue

Tired of broken main branches?

Mergify's merge queue tests every PR against the latest main before merging. Try it free.

Learn about Merge Queue

Recommended posts

We Stopped Our Config Builder From Destroying Your YAML, Then Found a Worse Bug Next to It
July 29, 2026·8 min read

We Stopped Our Config Builder From Destroying Your YAML, Then Found a Worse Bug Next to It

Our no-code config builder used to strip comments and anchors out of your .mergify.yml on every commit. Fixing it meant patching the document in place instead of re-dumping it, and an audit of the code next door turned up a parser bug that had been silently inverting a security condition in production.

Alexandre GaubertAlexandre Gaubert
The Native TypeScript Compiler Cut Our Typecheck From 13s to 3.5s. The Only Hard Part Was ESLint.
July 27, 2026·7 min read

The Native TypeScript Compiler Cut Our Typecheck From 13s to 3.5s. The Only Hard Part Was ESLint.

We swapped in TypeScript 7's native Go compiler and our dashboard typecheck went from 13s to 3.5s. The compiler was nearly a drop-in. The real work was keeping typescript-eslint alive when native 7.0 ships no importable compiler API.

Thomas BerdyThomas Berdy
Our Frontend Was Guessing What Our Parser Accepts. It Was Wrong for 70 of 75 Attributes.
July 17, 2026·8 min read

Our Frontend Was Guessing What Our Parser Accepts. It Was Wrong for 70 of 75 Attributes.

Most of the wrong menus were hiding valid operators, so nobody filed a bug. Instead of patching the heuristic, we made the engine's parser publish its own grammar through the config schema.

Thomas BerdyThomas Berdy