Versionner les configurations utilisateur

dim. 01 sept. 2013 by Marmotte

J'utilise régulièrement plusieurs ordinateurs. Avec le temps, je configure donc ces machines selon mes habitudes, afin de rendre leur utilisation plus simple et efficace pour moi.

Comme pour les notes d'installation, j'ai donc dupliqué les fichiers de configuration d'un ordinateur à l'autre, faisant des corrections sur chacun, sans forcément toujours les reporter sur les autres. J'ai donc décidé de les versionner. Le but est donc, ici aussi, de simplifier la mise à jour, et le partage de mes configurations.

Pourquoi utiliser un VCS (Version Control System) ?

Il existe plusieurs applications dédiées à la gestion de configurations au sein d'un parc de machines, comme Puppet, Chef, Salt, CFEngine.... Comme je partage les configurations de mon répertoire utilisateur uniquement, et qu'il n'a pas le même nom sur toutes les machines, ces applications ne me semblent pas adaptées.

Cela m'évite aussi la mise en place d'un service supplémentaire, puisqu'il me suffit d'un serveur SSH.

J'ai donc choisi d'utiliser git pour gérer mes configurations. Cela me permet de créer une branche par machine, pour celles qui ont besoin de configurations spécifiques, et chaque machine devient une sauvegarde des configurations de toutes les autres.

Configuration de base

Afin d'utiliser git pour versionner mon répertoire utilisateur sans que celui-ci ne deviennent un dépôt git, je nomme le répertoire du dépôt .home_git. Ainsi, les projets utilisant git qui se trouvent dans des sous répertoires de mon répertoire utilisateur ne seront pas gênés par celui-ci.

Pour simplifier l'écriture des commandes, j'ai défini un alias qui donne à git l'emplacement du dépôt, ainsi que l'emplacement du répertoire de travail qu'il doit utiliser.

$ echo 'alias homegit="git --git-dir=$HOME/.home_git --work-tree=$HOME"' >> ~/.bash_aliases
$ # Prise en compte de l'alias dans le shell courant
$ . ~/.bash_aliases

Note : Cette étape doit être effectuée sur toutes les machines qui utiliseront la configuration partagée.

Initialisation du dépôt

Sur la première machine, il faut initialiser le dépôt. Je crée donc un simple dépôt en mode bare, ce qui indique à git de créer un dépôt simple, sans répertoire de travail.

$ git init --bare ~/.home_git

Pour éviter que tout le contenu de mon répertoire utilisateur ne soit considéré comme nouvel élément non versionné, j'indique à git d'ignorer tous les éléments présents par défaut. Je pourrais ainsi choisir un par un les fichiers que git doit versionner, sans que le résultat des commandes telles que homegit status ne soient polluées par tous les éléments que je ne veux pas versionner.

$ homegit config core.excludesfile '~/.home_gitignore'
$ echo '*' > ~/.home_gitignore
$ homegit add ~/.home_gitignore
$ homegit commit -m "[INIT] Initial commit"

Note : Selon les versions de git, il peut être nécessaire d'ajouter le paramètre -f pour ajouter le fichier dans l'index.

Il ne reste plus qu'à envoyer la configuration sur un serveur

$ homegit remote add origin ssh://<username>@<hostname>/<Path>/homegit
$ homegit push origin --all
$ homegit push -u

Installation sur les autres machines

Sur les autres machines, il suffit de récupérer le dépôt, et de lui indiquer le nom du fichier d'exclusion.

$ git clone --bare ssh://<username>@<hostname>/<Path>/homegit ~/.home_git
$ # Déclaration manuelle de l'alias puisqu'il n'est présent dans aucun fichier de configuration existant
$ alias homegit="git --git-dir=$HOME/.home_git --work-tree=$HOME"
$ homegit config core.excludesfile '~/.home_gitignore'
$ # Mise à jour des fichiers de configuration selon le contenu du dépôt git
$ homegit reset ~
$ homegit checkout ~

Utilisation

Ce dépôt s'utilise comme n'importe quel dépôt git. Il suffit d'utiliser l'alias homegit plutôt que la commande git.

Par exemple, pour ajouter la configuration de git au dépôt, il suffit de faire :

$ homegit add ~/.gitconfig
$ homegit commit -m "[ADD] Add git config file"
$ homegit push