Un fichier global
.gitignore
pour les gouverner tous

Ne plus rendre nos projets Git dépendants de notre écosystème de développement.

1. Problématique avec les IDEs

1.1. Exemple avec PHPStorm

Clonons Symfony sur notre poste, créons et ouvrons le projet dans PHPStorm (Main menu > File > New project) et affichons le status Git ($ git status). Un dossier .idea a été généré par l’IDE à la racine du projet et apparait dans la liste des fichiers qui pourraient être commités :

$ git clone git@github.com:symfony/symfony.git
$ cd symfony

# Ouverture du projet Symfony dans PHPStorm

$ git status
...
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .idea/ (1)
...
1 Le dossier .idea généré par PHPStorm est repéré par Git.

Faisons de même avec Angular (clonons et créons un nouveau projet dans PHPStorm). Dans ce cas, nous ne verrons pas le dossier .idea apparaître :

$ git clone git@github.com:angular/angular.git
$ cd angular

# Ouverture du projet Angular dans PHPStorm

$ git status
...
nothing to commit, working tree clean (1)
1 Le dossier .idea généré par PHPStorm est ignoré par Git.

Pourquoi ? Regardons le fichier .gitignore d’Angular de plus près. Il contient des dossiers qui concernent directement le projet, pour la compilation, le cache ou les dépendances :

.gitignore
/dist/
/bazel-out
/integration/bazel/bazel-*
*.log
/node_modules/

# CircleCI temporary file for cache key computation.
# See `save_month_to_file` in `.circleci/config.yml`.
month.txt

...

# Don't check in secret files
*secret.js

# Ignore npm/yarn debug log
npm-debug.log
yarn-error.log

...

Mais aussi des éléments extérieurs au projet, comme des dossiers et des fichiers générés par les IDEs et éditeurs de code, ou macOS et Windows:

.gitignore
...

# Include when developing application packages.
pubspec.lock
.c9
.idea/ (1)
.devcontainer/*
!.devcontainer/README.md
!.devcontainer/recommended-devcontainer.json
!.devcontainer/recommended-Dockerfile
.settings/
.vscode/launch.json
.vscode/settings.json
.vscode/tasks.json
*.swo
*.swp
modules/.settings
modules/.vscode
.vimrc
.nvimrc

# Ignore .history for the xyz.local-history VSCode extension
.history

.DS_STORE
1 Le dossier .idea généré par PHPStorm est ignoré par Git.

Le fichier .gitignore de Symfony, quant à lui, ne contient pas ces éléments extérieurs au projet, et n’ignore pas le dossier .idea:

.gitignore
vendor/
composer.lock
phpunit.xml
.php-cs-fixer.cache
.php-cs-fixer.php
.phpunit.result.cache
composer.phar
package.tar
/packages.json
/.phpunit

1.2. Ignorer le dossier .idea

Solution locale

On ajoute le dossier .idea au fichier .gitignore, à la racine du projet, que nous committons :

$ echo '.idea/' >> ~/.gitignore
$ git commit -a -m "Ignore .idea folder"

Le risque sera de devoir répéter cette opération à chaque nouveau projet.

Solution globale

On ajoute le dossier .idea à un fichier ~/.gitignore_global, fichier reconnu par Git de façon global :

$ echo '.idea/' >> ~/.gitignore_global
$ git config --global core.excludesfile ~/.gitignore_global

Nous n’aurons à faire cette opération qu’une seule fois. Tous nos projets locaux n’auront plus aucune connaissance des dossiers spécifiques à PHPStorm.

2. Solution complète (synthèse)

2.1. Étape #1 - Créer un fichier global vide

$ touch ~/.gitignore_global

2.2. Étape #2 - Compléter le fichier global

$ vim ~/.gitignore_global

Copier/Coller les lignes suivantes :

~/.gitignore_global
# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
.vimrc
.nvimrc

# Visual Studio Code
.vscode/*
.history/*

# System files
.DS_Store
Thumbs.db
Pour sauver dans vim, appuyez sur Esc pour passer en mode "commande", ensuite tapez :wq pour sauvegarder et sortir du fichier.

2.3. Étape #3 - Activer le fichier global

$ git config --global core.excludesFile '~/.gitignore_global'

2.4. Visual Studio Code

Si j’ai besoin d’avoir une stratégie plus fine pour Visual Studio Code, je peux, par exemple, intégrer le bloque suivant dans le fichier .gitignore du projet local :

.gitignore
# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*

2.5. Composer & Node

Pour Composer ou Node, il est préférable de configurer le fichier .gitignore du projet local, et non le Git global, pour éviter à toute autre personne de se retrouver, au clonage et à la première installation, avec les dossiers vendor ou node_modules repérés par Git :

.gitignore
# Composer
vendor/

# Node
node_modules/
Vous pouvez retrouver ma fiche synthèse Gist en anglais.