Git & dotfiles : versionner ses fichiers de configuration

Lorsque vous prenez le temps de configurer un outil pour qu’il corresponde à vos besoins et à vos goûts, vous n’avez pas forcément envie de répéter ces manipulations. Il est donc intéressant de trouver une solution pour les sauvegarder ailleurs et pouvoir les réutiliser. Pour y parvenir, il existe différentes approches allant du disque dur externe au service de stockage en ligne type Dropbox en passant par Git. Dans cet article, je me pencherai uniquement sur l’utilisation de Git pour gérer ses dotfiles.

Qu’est-ce qu’un dotfile ?

Si vous êtes utilisateur de Windows, le terme ne vous parle pas forcément contrairement aux utilisateurs de Linux et Mac.

Les « dotfiles » sont des fichiers texte contenant diverses configurations pour votre système et vos logiciels. Ils sont généralement cachés par défaut ; il faudra donc « Afficher les fichiers cachés » pour les découvrir. Il s’agit du nom de l’option dans Thunar avec Xfce ; ce nom est peut-être différent chez vous.

Dotfiles

De nombreux logiciels utilisent d’autres formats pour sauvegarder leur configuration. On inclura dans le terme « dotfile » les fichiers présents dans ~/.config/programme/configfile. Il peut s’agir de fichier .json par exemple.

Pourquoi sauvegarder ses dotfiles ?

Certaines personnes, comme moi, prennent du temps pour configurer leur machine comme elles le souhaitent. Même si ce n’est pas déplaisant de configurer un outil, cela est chronophage. Il n’est pas souhaitable de refaire les mêmes manipulations à chaque formatage ou lorsqu’on utilise plusieurs machines (maison, travail, pc portable, etc.). De même, vous pourriez très bien faire une fausse manipulation et perdre un fichier, votre disque dur peut être en fin de vie ou encore vous pourriez vous faire voler votre PC. Il est donc intéressant de trouver une solution pour sauvegarder ces fichiers.

Dans le cas d’un formatage, à moins de changer de système d’exploitation, il est plutôt simple de restaurer ces fichiers. En revanche, dans le cas où vous utilisez plusieurs machines, il se peut que ces dernières comportent des configurations spécifiques. Il n’est donc pas souhaitable de synchroniser tous les fichiers. Avec son système de branches, Git peut vous aider à palier à ce problème. Vous pouvez créer une branche master contenant les fichiers communs aux différents systèmes et des branches spécifiques à chaque système. Il est ensuite possible d’utiliser un opérateur logique dans le fichier de configuration de Bash pour appliquer les bons fichiers en fonction du nom de la machine par exemple.

Git semble donc tout adapté à nos besoins puisqu’il nous permet de sauvegarder, synchroniser et créer des branches spécifiques. Reste à savoir comment s’y prendre.

Les différentes méthodes pour gérer ses dotfiles avec Git

Évidemment, vous pourriez copier vos fichiers de configuration dans un dossier à part et utiliser ce dossier comme dépôt. Toutefois, il faut alors penser à mettre à jour ses fichiers à chaque fois qu’une modification est faite. La solution n’est donc pas optimale. Il existe d’autres approches.

Les liens symboliques

La première solution consiste à créer un répertoire quelque part sur votre machine qui servira de dépôt. Vous déplacez vos fichiers de configuration dans ce dossier et vous créez des liens symboliques vers l’emplacement original. Cette solution fonctionne, mais ce n’est pas forcément la plus pratique de mon point de vue.

Faire de sa /home/ un dépôt

Une autre solution consiste à initier un dépôt Git dans le répertoire /home/user et d’ignorer tout le contenu avec un fichier .gitignore. Dans ce même fichier, vous pourrez alors spécifier les fichiers et dossier à suivre. Cette technique vient avec un inconvénient : vous ne pourrez plus savoir quels fichiers ne sont pas suivis à moins de comparer manuellement votre fichier .gitignore avec le contenu du répertoire /home/user. De plus, les fichiers Git seront directement dans votre home ; je n’aime pas tellement cette approche.

Créer un « bare repository » avec un alias

Un bare repository est un dépôt sans instantané, il contient uniquement l’historique. Vos fichiers restent à leur place ; l’historique est placé ailleurs. Dans le cas des dotfiles, nous n’avons pas besoin de cet instantané. Si vous souhaitez en savoir plus sur les bare repository, je vous invite à lire cet article de Greg Owen, en anglais.

Nous créons un bare repository dans notre répertoire home et nous spécifions une branche de travail. Vous pouvez ainsi créer un dossier nommé .dotfiles, par exemple, et l’utiliser comme un dépôt Git.

mkdir $HOME/.dotfiles
git init --bare $HOME/.dotfiles

Nous créons ensuite un alias qui servira à gérer les fichiers de configuration. Nous allons lui donner le même nom que notre dossier.

alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'

Il est maintenant possible d’utiliser git au travers de l’alias dotfiles. Vous pouvez évidemment choisir un autre alias et un autre nom pour le dossier contenant vos fichiers.

Commençons par dire à Git de ne pas afficher les fichiers non suivis lors d’un git status.

dotfiles config status.showUntrackedFiles no

Pour ajouter les fichiers de configuration que vous souhaitez versionner, vous pourrez ainsi faire :

dotfiles add .bash_profile .profile

Ensuite, vous utiliserez dotfiles commit et dotfiles push pour synchroniser les fichiers avec votre repo Github ou Gitlab. Avant de faire ça, pensez à configurer votre remote comme dans n’importe quel dépôt git.

Utiliser des outils

Il existe de nombreux outils pour vous aider à gérer vos dotfiles. Je ne les ai pas tous testés, je ne m’étendrai donc pas sur leurs spécificités. Certains automatisent la création de liens symboliques, d’autres fonctionnent un peu comme un bare repository et d’autres encore font sûrement autre chose. Le wiki d’Archlinux propose une liste de ces outils si ça vous intéresse. De mon côté, je vais me contenter de vous présenter chezmoi puisque je l’utilise.

Chezmoi va créer un dépôt git dans ~/.local/share/chezmoi. Lorsque vous ajouterez des fichiers avec la commande chezmoi add, une copie sera placée dans ce dossier avec un nom légèrement différent : le « . » (point) est remplacé par « dot_ ». Chezmoi permet également d’éditer, de vérifier les changements et de les appliquer. Il ne reste plus qu’à se placer dans son répertoire et à utiliser git add, git commit et git push.

Parmi ses fonctionnalités intéressantes, il faut noter :

  • la gestion des secrets en utilisant un gestionnaire de mots de passe (il en supporte beaucoup) ou GPG
  • la détection des droits d’un fichier pour déterminer s’il est privé ou public
  • la possibilité de créer des templates pour changer le comportement en fonction de la machine utilisée, ce qui évite l’utilisation de branches
  • pour ceux qui n’utilisent pas Git, il est possible d’utiliser un autre gestionnaire de version

Quelle solution choisir ?

Je n’ai pas vraiment de conseils à vous donner. Je me suis décidé à gérer mes fichiers de configuration avec Git depuis peu, je manque donc de recul. Je n’ai pas cherché à synchroniser mes fichiers avec une autre machine, je n’ai pas une vision d’ensemble des avantages et inconvénients de chacun. Actuellement, les deux approches que je juge les plus intéressantes sont le bare repository et chezmoi.

Pour le moment, je me contente du bare repository : son utilisation est plutôt simple et je n’ai pas à changer mes habitudes. Ceci dit, ce n’est peut-être pas la solution idéale puisqu’il peut y avoir des conflits en clonant le dépôt si les fichiers existent déjà (si on souhaite configurer une nouvelle machine par exemple). De même, pour gérer les secrets, ce n’est peut-être pas la meilleure méthode ; c’est pourquoi je préfère garder mon repository privé pour le moment.

Au final, il faudrait que je teste davantage chezmoi. L’outil a l’air complet et permet de gérer les conflits et les secrets. Par contre, il faut changer un peu ses habitudes pour l’utiliser. Par exemple, il ne faut pas éditer directement son fichier de configuration (avec nano par exemple), il faut penser à utiliser chezmoi edit. De même, la mise en place des templates pour les secrets n’a pas l’air évident de premier abord. Cela fera peut-être l’objet d’un futur article, si je décide de m’y mettre.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.