Git, configuration et fourberies


Souvenez-vous, les lignes de commandes suivantes sont celles que vous avez exécutées après avoir installé Git.

git config --global user.name jean-smaug
git config --global user.email maximeblanc.dev@gmail.fr

Elles ont permis à Git de vous connaitre en tant qu’utilisateur. Preuve en est, si vous faites un git log --pretty=full, votre nom d’utilisateur et votre email sont associés à tous les commits que vous avez créés.

Vous êtes-vous déjà demandé pourquoi il y avait un --global dans cette commande ? Aujourd’hui on répond à cette question et on voit comment gagner du temps dans l’utilisation de Git.

Les fichiers de configuration

Il existe trois fichiers de configuration :

  • système : relatif à la machine, nous ne l’utiliserons pas
  • global : relatif à un utilisateur du système
  • local : relatif au dépôt

Avec cette information vous aurez compris que si on configurait l’utilisateur sans l’option --global on devrait le configurer pour chacun de nos dépôts Git. Dans une logique de non-perte de temps, ce n’est pas la meilleure solution.

Les chemins des fichiers de configuration sont les suivants :

  • ~/.gitconfig pour le global
  • dossier-projet/.git/config pour le local

Commençons par inspecter le fichier de configuration globale. Soit vous l’ouvrez à l’emplacement précédemment mentionné soit vous pouvez lancer la commande git config --global --edit. Il est écrit en TOML et ressemble à cela :

[user]
  email = maximeblanc.dev@gmail.com
  name = jean-smaug

Cet exemple contient la section user que l’on a configuré via la ligne de commande. Il est bien entendu possible de configurer Git en éditant de fichier manuellement.

Hiérarchie de configuration

Imaginons que la configuration globale utilisée est celle de mon ordinateur personnel et que je doive travailler sur un projet d’entreprise. Je ne vais pas committer sous l’appellation “jean-smaug”, vous vous en doutez. Depuis le répertoire du projet il me suffit de lancer

git config user.name maxime blanc
git config user.email maxime@blanc.fr

De cette façon, les commits de ce projet appartiendront à maxime blanc alors que les commits des autres projets appartiendront à jean-smaug.

Même si user.name et user.email sont définis dans les deux configurations, une seule est prise en compte. La configuration locale est prioritaire sur la configuration globale, elle-même prioritaire sur la configuration système.

Si vous voulez voir la configuration que Git utilise au sein de votre projet la commande git config --list --show-origin fera votre bonheur. Cette commande indique les options qui viennent de la configuration locale et celles qui viennent de la configuration globale.

Quelques options à modifier (ou pas)

Dans cette partie on va passer en revue quelques options qu’il peut être intéressant de modifier. Il en existe beaucoup d’autres, ici je présente celle qui pourraient intéresser la majorité d’entre vous.

Core

git config core.editor vim

L’éditeur utilisé pendant les rebases interactifs, les commits… Vim ou Nano sont de bons choix car léger mais VSCode peut aussi convenir.

git config core.ignoreCase true

Par défaut Git fait la différence entre index.js et INDEX.js. Les systèmes de fichier FAT et NTFS n’étant pas sensible à la casse, ce paramètre peut être utile pour éviter les problèmes.

Réseau

git config fetch.prune true

Supprime les copies des références distantes (branches, tags…), qui n’existent plus sur le dépôt distant.

git config pull.rebase true

La commande pull utilisera le rebase plutôt que le merge comme stratégie de mise à jour.

Rebase

git config rebase.autoSquash true

Permet de squasher les commits de fixup.

git config rebase.autoStash true

Stash les modifications de l’espace de travail avant un rebase et applique le stash à la fin du rebase.

git config rebase.abbreviateCommands true

Utilise les versions courtes des options de rebase, p pour pick, r pour rename… lors d’un rebase interactif.

git config rerere.enabled true

Rerere ou Reuse recorded resolution, sauvegarde les résolutions de conflits que vous avez traité et les ré-applique automatiquement en cas de conflits identiques.

Divers

git config blame.showEmail true

Affiche les emails pendant un git blame

git config status.short true

Version allégée du git status

Dois-je activer ces options ?

Il n’y a pas de réponse unique, cela dépend de votre façon de travailler.

Il faut savoir que la majorité des customisations proposées est réalisable via la ligne de commande. Par exemple, éxecuter git pull --rebase équivaut à un git pull en ayant au préalable activé l’option pull.rebase dans la configuration.

Donc si vous ajoutez souvent des options à vos commandes il peut être utile de modifier la configuration.

Ça reste entre nous 🤫

Dans cette section, je vais présenter quelques techniques pour briser la confiance mutuelle que vous avez avec vos collègues. Et pour cela nous aurons uniquement besoin d’une configuration Git.

Un monde au mille et une couleurs

On peut modifier le comportement des commandes mais aussi les couleurs des textes dans la console.
Je vais vous proposer ici 3 configurations à essayer sur votre poste mais surtout sur celui de vos collègues.

La version nostalgique des années 80

[color "status"]
  hint = red
  header = magenta
  added = green
  updated = blue
  changed = yellow
  untracked = cyan

Je vous montre le splendide résultat ici, et je vous laisse tester les suivantes par vous-même.

80's

La version pompes funèbres

[color "status"]
  hint = black
  header = black
  added = black
  updated = black
  changed = black
  untracked = black

La version ne pas utiliser si vous êtes daltonien 🙃

[color "status"]
  hint = yellow green
  header = yellow green
  added = yellow green
  updated = yellow green
  changed = yellow green
  untracked = yellow green

Ici j’ai présenté la customisation de la commande git status, il faut savoir qu’il est aussi possible d’appliquer ces changements sur les blames, les diffs, les branches… Certes, la configuration de couleur n’est pas la fonctionnalité qui va révolutionner votre façon de travailler, mais le style à son importance comme dirait l’autre.

Le capitaine Crochet

Si votre équipe a décidé d’utiliser les hooks de pré-commit et/ou de pré-push, vous avez deux solutions :

  • La quitter
  • Utiliser l’astuce qui suit tout en planifiant votre départ

Pour ignorer les hooks il faut ajouter le paramètre --no-verify a sa commande. Mais le taper à chaque fois est pénible.

Pour automatiser le processus il est possible de créer des alias dans le fichier de configuration.

[alias]
  cm = commit --no-verify
  pu = push --no-verify

Ainsi, les commandes git cm et git pu, “committerons” et “pusherons” en ignorant les hooks.

Bien plus que pour ignorer des hooks, les alias sont très pratiques, ils permettent d’aller plus beaucoup plus vite. Mes alias sont disponibles ici mais n’hésitez pas à créer les votres !

Le tour est joué, vous pouvez développer tranquillement.

S’attribuer le travail d’un collègue

Nous avons vu plus haut comment configurer un utilisateur. Lors de cette opération, Git va configurer deux choses :

  • l’auteur : celui qui a écrit et commité le code
  • le “committeur”: celui qui a réalisé les dernières manipulations sur les commits

C’est pour cela que sur Github, lorsque vous rebasez le travail d’un autre, vous pouvez voir apparaître deux avatars sur un commit.

author-and-committer

Même dans la partie WTF, on peut apprendre des choses 👍

Le but est de modifier l’auteur, car c’est sur l’auteur que Github se base pour les statistiques de contribution.

Vous avez sûrement envie de modifier le fichier de configuration local et d’y apposer votre email, afin d’avoir la priorité sur la configuration globale. Excellent réflexe ! Il existe cependant une façon plus discrète de configurer un utilisateur qui à la priorité sur la configuration locale : les variables d’environnement.

Sur la machine cible, lancez les commandes suivantes laissez le bosser pour vous.

export GIT_AUTHOR_EMAIL=jack@sparrow.io
export GIT_AUTHOR_NAME=jack sparrow

Croyez-moi, ça marche.

crook

BONUS : le jeu de la Gitime

Une fois la variable d’environnement modifiée, et que votre collègue a poussé son code sur le dépôt, plusieurs solutions :

  • Il s’en aperçoit avant de demander une revue, il fait 10 squats pour avoir laissé son poste non verrouillé.
  • C’est un autre collègue qui s’en aperçoit pendant la revue, la Gitime prend un gage. Et alors là, il faut être créatif. On peut choisir les classiques chocolatines mais on peut aussi le déguiser, en fée, en Babouche (le singe, pas la chaussure)… Ça lui apprendra à ne pas relire ses PR avant de demander une revue.
  • Si jamais la PR est mergée sans qu’il s’en aperçoive alors la, je vous laisse vous arranger entre vous. Mais il ne doit pas s’en sortir indemne.

Conclusion

Nous avons passé en revue les différentes manières pour adapter Git à sa façon de travailler : configuration, alias, variables d’environnement.

Retenez que l’ordre appliqué pour les options est le suivant : Configuration système > Configuration globale > Configuration locale > Variable d’environnement > Options de commandes.

Le plus important étant que, vous êtes désormais armés pour lutter contre vos collègues. Puisse le sort vous être favorable.

Si jamais certaines notions ou commandes mentionnées dans l’article ne sont pas claires, restez à l’affût des prochains articles qui aborderont ces points. Je vous invite aussi à consulter la documentation qui est très bien faite.

Merci à Aubin Dugelet pour la relecture.

Merci de m’avoir lu.

Liens