Utiliser git pour gérer les fichiers de configuration de son HOME

Posted on 2014-09-09 in Trucs et astuces

Depuis pas mal de temps, je gère les fichiers de conf de mon home avec git, notamment ma conf emacs et mon dossier bin. L'intérêt étant à la fois de pouvoir partager les configurations entre plusieurs ordinateurs, de pouvoir revenir en arrière en cas de besoin et de voir l'historique (surtout pour emacs).

Je faisais ça à la main, avec un dépôt git tout simple. Puis, suite à lecture de cet article, j'ai décidé de passer à vcsh et mr.

VCSH – Version Control System for $HOME

L'intérêt de ce logiciel est qu'il vous permet de faire cohabiter plusieurs dépôts git dans un même dossier. Ainsi vous pouvez facilement avoir un dépôt git par catégorie de logiciel : un pour emacs, un pour votre bin, un autre pour zsh, …

Par défaut, tous les dépôts sont dans ~/.config/vcsh/repos.d. Évidemment ça se paramètre, voir la page du projet sur github.

Normalement, vous pouvez installer vcsh depuis les dépôts de votre distribution.

mr — myrepo

mr est le compagnon de vcsh puisqu'il vous permet en une seule commande d'agir sur plusieurs dépôts. Ainsi, pour pusher ou puller les modifications de tous les dépôts sur un serveur il suffit de faire mr push ou mr checkout. Il permet aussi de gérer la configuration des dépôts (sur quels url pusher les modifications, sur votre serveur perso et sur github par exemple).

Une fois de plus, le logiciel devrait être dans les dépôts de votre distribution. Plus d'infos ici.

Mettre en place vcsh

Vous devez tout d'abord identifier comment vous désirez organiser vos dépôts. Personnellement, je me suis organisé comme suis (les liens pointent sur github) :

  • dvcs pour les configurations de git, mercurial et mr
  • emacs pour la configuration d'Emacs
  • shell pour mon bin/ et les aliases + fonction
  • zsh pour la configuration de zsh

Pour initialiser un nouveau dépôt, rien de très compliqué :

# Initialisation du dépôt
vcsh init emacs
# Création du gitignore pour éviter d'avoir des erreures sur les dossiers non #suivi.
# Met simplement * dans le fichier.
vcsh write-gitignore emacs
# Ajout des fichiers
vcsh emacs add -f ~/.emacs ~/.emacs.d ~/.gitignore.d/emacs
vcsh emacs commit -am 'intial commit'
vcsh emacs remote set-url --add origin git@github.com:Jenselme/dot-files-emacs.git

Il peut être intéressant de personnaliser son .gitignore (qui de base est un peu violent), surtout pour des configurations auxquelles on ajoute des fichiers (comme celle d'emacs). Pour cela, il faut utiliser le ! pour inclure un sous chemin exclu. Par exemple avec mon ~/.gitignore.d/emacs (le / représente la racine du dépôt) :

/*
!/.emacs
!/.emacs.d
*.elc
*~
/.emacs.d/session*
/.emacs.d/tramp
.emacs.d/url
.emacs.d/semanticdb/*
\#*
.emacs.d/*.dat
.emacs.d/*.lst

Je signale que si vous omettez le nom du dépôt pour une commande vcsh, alors elle s'appliquera à tous. Particulièrement utile si vous voulez connaître le statut de tous vos dépôts.

Configurer mr

La configuration de mr se place dans ~/.mrconfig. Ma configuration permet de pusher mes dépôts à la fois sur mon serveur perso et sur github (pour partager). Je la présente en intégralité et je vous laisse vous en inspirer pour la vôtre.

[DEFAULT]
git_gc = git gc "$@"

[$HOME/.config/vcsh/repo.d/emacs.git]
checkout =
  vcsh clone --recursive ssh://git@jujens.eu/home/git/emacs.git emacs
  vcsh emacs remote add github git@github.com:Jenselme/dot-files-emacs.git

push =
  vcsh emacs push
  vcsh emacs push github

[$HOME/.config/vcsh/repo.d/zsh.git]
checkout =
  vcsh clone ssh://git@jujens.eu/home/git/zsh.git zsh
  vcsh zsh remote add github git@github.com:Jenselme/dot-files-zsh.git

push =
  vcsh zsh push
  vcsh zsh push github

[$HOME/.config/vcsh/repo.d/dcvs.git]
checkout =
  vcsh clone ssh://git@jujens.eu/home/git/dcvs.git dcvs
  vcsh dcvs remote add github git@github.com:Jenselme/dot-files-dcvs.git

push =
  vcsh dcvs push
  vcsh dcvs push github

[$HOME/.config/vcsh/repo.d/shell.git]
checkout =
  vcsh clone ssh://git@jujens.eu/home/git/shell.git shell
  vcsh shell remote add github git@github.com:Jenselme/dot-files-shell.git

push =
  vcsh shell push
  vcsh shell push github

Récupérer la configuration

Si vous arrivez sur une nouvelle machine, vous n'avez plus qu'à installer mr et vcsh et cloner le dépôt contenant la configuration de mr.

vcsh clone ssh://git@jujens.eu/home/git/dcvs.git dcvs
mr checkout

Pour mettre à jour tous ces dépôts, un petit mr update suffit.

Conclusion

Le duo vcsh + mr est simple et efficace pour partager ses configurations entre plusieurs ordinateurs.