Git config – les options indispensables

Si vous utilisez Git, vous connaissez probablement la commande ‘git config’ qui permet de paramétrer Git. Vous savez peut être qu’il existe 3 niveaux possibles de stockage de ces paramètres :
– system (tous les utilisateurs)
– global (pour votre utilisateur)
– local (pour votre projet courant)

Si un paramètre est défini localement et globalement avec des valeurs différentes, ce sera la valeur locale qui sera utilisée (le niveau le plus bas surcharge les niveaux supérieurs).

Il est possible d’afficher sa configuration avec :

    git config --list

On peut ajouter une valeur très simplement, par exemple mon user.name (utilisé pour l’auteur des commits) :

    git config --global user.name cexbrayat

Et l’on peut supprimer une valeur avec –unset :

    git config --unset user.name

Savez vous que l’on peut également définir des alias de commande? Par exemple, j’utilise souvent l’alias ‘lg’ pour une version de ‘log’ améliorée :

    git config alias.lg “log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset' --abbrev-commit”

Mais revenons à nos paramétrages. La doc de Git est très riche et il n’est pas simple de savoir quelles options peuvent être utiles. Le fichier ‘.gitconfig’ dans votre ‘home’ contient tous vos paramétrages (lorsque vous les avez ajouté en global). Ce fichier regroupe les clés par section, par exemple user.name et user.email sont regroupées dans une section [user]. Vous allez voir, rien de compliqué!

Voici les paramètres que j’aime utiliser :

    [user]
        email = cedric@ninja-squad.com
        name = cexbrayat

Ces deux paramètres sont nécessaires pour faire un commit et apparaîtront dans le log de vos collègues, à compléter dès l’installation donc!

    [core]
        editor = vim
        pager = less
        excludesfile = ~/.gitignore_global

La section core contient beaucoup d’options possibles. Parmi elles, ‘editor’ vous permet de choisir quel éditeur de texte sera utilisé (j’aime bien vim, si si je vous assure, mais vous pouvez très bien mettre SublimeText par exemple, avec ‘subl -w’), idem pour le pager utilisé par Git (pour afficher le log par exemple). Il faut savoir que Git pagine dès que l’affichage ne rentre pas dans votre écran : certains détestent ça et préfèrent utiliser ‘cat’ plutôt.

L’option `excludesfile` permet d’ignorer de façon globale certains fichiers en les précisant dans un `.gitignore` global. Le mien est inspiré de celui de Github.

    [alias]
        lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset' --abbrev-commit
        wdiff = diff --word-diff

Cette section contient tous les alias que vous ajouterez. Comme j’utilise oh-my-zsh et son plugin Git, j’ai déjà beaucoup d’alias disponibles (par exemple ‘gc’ pour ‘git commit’). On retrouve donc ‘lg’ pour un meilleur log et ‘wdiff’ pour un diff en mode ‘mot’ et pas ‘ligne’. Exemple avec ‘git diff’ :

    -:author:    Ninja Squad
    +:author:    Ninja Squad Team

Un seul mot ajouté, mais Git considère que la ligne entière est changée. Alors qu’avec ‘git wdiff’ :

    :author:    Ninja Squad{+ Team+}

Il reconnaît bien le seul ajout de mot sur la ligne!

    [color]
        ui = auto

Git est tout de suite plus convivial en ligne de commande avec un peu de couleur. Il est quasiment possible de définir pour chaque commande quelle couleur vous voulez, mais le plus simple est d’utiliser la clé ‘color.ui’ qui donne une valeur par défaut à toutes les commandes. A vous les branches en couleur, le log en couleur, le diff en couleur…

    [credential]
        helper = osxkeychain

Si vous utilisez un repo distant protégé par mot de passe (à tout hasard Github), il est possible de stocker votre mot de passe pour ne pas avoir à le saisir à chaque fois. Sur MacOS, le keychain se charge de le stocker pour vous.

    [clean]
        requireForce = false

Git possède une commande ‘clean’ pour supprimer les fichiers non suivis. Mettre requireForce à false permet d’éviter d’avoir à ajouter le flag ‘-f’.

    [diff]
        mnemonicprefix = true

Par défaut lorsque vous faites un ‘diff’, Git vous affiche par exemple :

    --- a/Git/git.asc
    +++ b/Git/git.asc

Ces préfixes a/ et b/ ne sont pas très parlants n’est ce pas? En passant ‘diff.mnemonicprefix’ à true, Git va afficher des préfixes plus logiques, par exemple ‘i’ pour index et ‘w’ pour le work tree (votre dossier de travail). Exemple :

    --- i/Git/git.asc
    +++ w/Git/git.asc

Pratique.

    [help]
        autocorrect = -1

L’une de mes fonctionnalités préférées! Si comme moi vous avez tendance à entrer ‘git rzset’ comme commande, vous avez déjà vu Git vous dire :

Did you mean this?
    reset

Mais ne rien faire pour autant! Et bien en activant l’autocorrection, git va remplacer votre commande par ‘git reset’ automatiquement. Il est possible de laisser un délai en donnant un entier positif comme valeur, ici, avec -1, la correction sera immédiate.

    [rerere]
        enabled = true

Si vous avez lu mon dernier article sur Git, vous savez déjà tout le bien que peut vous apporter ‘rerere’!

    [push]
        default = upstream

Actuellement (Git < 2.0), Git pousse toutes les branches modifiées qui existent sur le repo distant lors d’une commande ‘git push’ (valeur ‘matching’). Je trouve toujours ça un peu dangereux, car on a parfois oublié que l’on a des modifications sur une autre branche que celle en cours, et que l’on ne voudrait pas forcément partager immédiatement. A partir de Git 2.0, la nouvelle valeur sera ‘simple’ : seule la branche courante sera poussée si une branche du même nom existe. La valeur que je préfère est ‘upstream’, qui comme ‘simple’, permet de pousser seulement la branche locale, mais ce même si la branche distante ne possède pas le même nom.

    [rebase]
        autosquash = true
        autostash = true

Lorsqu’on effectue un rebase, Git propose la liste des commits concernés avec un verbe d’action pour chacun (en l’occurence ‘pick’). Ce verbe d’action peut être modifié pour devenir ‘reword’, ‘edit’, ‘squash’ ou ‘fixup’. Les deux derniers compressent deux commits en un seul. Parfois je sais dès que je commite qu’il devra fusionner avec le précédent. En préfixant le message de commit par ‘fixup!’, lors du rebase qui viendra, le commit sera automatiquement précédé par le verbe ‘fixup’ plutôt que ‘pick’!

L’option ‘rebase.autostash’ est toute récente (release 1.8.4.2 de Git) et permet d’automatiser une opération un peu pénible. Lorsque l’on lance un rebase, le répertoire de travail doit être sans modification en cours, sinon le rebase ne se lance pas. Il faut alors commiter ou stasher les modifications avant de recommencer le rebase. Avec cette option ‘rebase.autostash’, le rebase mettra dans automatiquement les modifications courantes dans le stash avant de faire le rebase, puis ré-appliquera les modifications ensuite.

    [pull]
        rebase = true

Par défaut, ‘pull’ effectue un ‘fetch’ suivi d’un ‘merge’. Avec l’option ‘rebase’, ‘pull’ effectuera un ‘fetch’ suivi d’un ‘rebase’.

Allez, pour votre culture, un petit tour des sections moins utiles mais parfois intéressantes.

    [advice]

Il est possible de désactiver tous les conseils que vous affiche Git en cas de problème. C’est un peu comme activer le mode difficile de Git, c’est vous qui voyez…

    [commit]

Il est possible de customiser le template de message de commit avec l’option ‘commmit.template’. Cela peut être pratique si vous avez des pratiques partagées par toute l’équipe (comme celles de l’équipe AngularJS).

Vous pouvez trouver mon ‘.gitconfig’ complet sur mon repo Github.

Et vous, quelles sont vos options préférées?

À propos de Cédric Exbrayat

Cédric Exbrayat, développeur et fondateur Ninja Squad, se réunit avec ses semblables régulièrement que ce soit au Lyon JUG ou à Mix-it, dont il est le fondateur. Java et JS for food and fun.

Publié le 30/09/2013, dans Tips, et tagué . Bookmarquez ce permalien. Poster un commentaire.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :