Disclaimer : le titre est légèrement hyperbolique, il existe d’autres solutions éprouvées au problème. Je pense cependant que la technique ci-dessous est très élégante.

Récemment, j’ai lu cette technique étonnante dans un fil de discussion de Hacker News sur les solutions des gens pour stocker leurs dotfiles. L’utilisateur StreakyCobra a montré sa configuration élégante et …. Cela avait tellement de sens ! Je suis en train d’adopter la même technique pour mon propre système. Le seul prérequis est d’installer Git.

Dans ses mots, la technique ci-dessous nécessite :

Aucun outil supplémentaire, aucun lien symbolique, les fichiers sont suivis sur un système de contrôle de version, vous pouvez utiliser différentes branches pour différents ordinateurs, vous pouvez répliquer votre configuration facilement sur une nouvelle installation.

La technique consiste à stocker un dépôt nu Git dans un dossier « latéral » (comme $HOME/.cfg ou $HOME/.myconfig) en utilisant un alias spécialement conçu pour que les commandes soient exécutées contre ce dépôt et non le dossier local habituel .git, ce qui interférerait avec tout autre dépôt Git autour.

Commencer à partir de zéro

Si vous n’avez pas encore suivi vos configurations dans un dépôt Git, vous pouvez commencer à utiliser cette technique facilement avec ces lignes :

git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
  • La première ligne crée un dossier ~/.cfg qui est un dépôt Git nu qui suivra nos fichiers.
  • Puis nous créons un alias config que nous utiliserons à la place du git habituel lorsque nous voudrons interagir avec notre dépôt de configuration.
  • Nous mettons un drapeau – local au dépôt – pour cacher les fichiers que nous ne suivons pas encore explicitement. C’est pour que lorsque vous tapez config status et d’autres commandes plus tard, les fichiers que vous n’êtes pas intéressé à suivre n’apparaîtront pas comme untracked.
  • Aussi, vous pouvez ajouter la définition de l’alias à la main à votre .bashrc ou utiliser la quatrième ligne fournie pour plus de commodité.

J’ai emballé les lignes ci-dessus dans un snippet jusqu’à Bitbucket et l’a lié à partir d’un short-url. Ainsi, vous pouvez configurer les choses avec:

curl -Lks http://bit.do/cfg-init | /bin/bash

Après avoir exécuté la configuration, tout fichier dans le dossier $HOME peut être versionné avec des commandes normales, en remplaçant git par votre alias config nouvellement créé, comme :

config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Installer vos dotfiles sur un nouveau système (ou migrer vers cette configuration)

Si vous stockez déjà votre configuration/dotfiles dans un dépôt Git, sur un nouveau système, vous pouvez migrer vers cette configuration en suivant les étapes suivantes :

  • Avant l’installation, assurez-vous d’avoir validé l’alias dans votre .bashrc ou .zsh :
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Et que votre dépôt de sources ignore le dossier où vous allez le cloner, afin de ne pas créer d’étranges problèmes de récurrence :
echo ".cfg" >> .gitignore
  • Maintenant clonez vos dotfiles dans un dépôt nu dans un dossier « dot » de votre $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Définissez l’alias dans la portée actuelle du shell :
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Checkout du contenu réel du dépôt nu vers votre $HOME:
config checkout
  • L’étape ci-dessus pourrait échouer avec un message comme :
error: The following untracked working tree files would be overwritten by checkout:
.bashrc
.gitignore
Please move or remove them before you can switch branches.
Aborting

C’est parce que votre dossier $HOME pourrait déjà avoir certains fichiers de configuration de stock qui seraient écrasés par Git. La solution est simple : sauvegarder les fichiers si vous y tenez, les supprimer si vous n’y tenez pas. Je vous fournis un raccourci grossier possible pour déplacer automatiquement tous les fichiers incriminés vers un dossier de sauvegarde :

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | \
xargs -I{} mv {} .config-backup/{}
  • Ré-exécuter le check out si vous avez eu des problèmes :
config checkout
  • Mettre le drapeau showUntrackedFiles à no sur ce dépôt spécifique (local):
config config --local status.showUntrackedFiles no
  • Vous avez terminé, vous pouvez désormais taper des commandes config pour ajouter et mettre à jour vos dotfiles :
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Encore comme raccourci pour ne pas avoir à se souvenir de toutes ces étapes sur toute nouvelle machine que vous voulez configurer, vous pouvez créer un script simple, le stocker comme snippet Bitbucket comme je l’ai fait, créer une url courte pour lui et l’appeler comme ceci :

curl -Lks http://bit.do/cfg-install | /bin/bash

Pour être complet, voici ce que j’ai fini par obtenir (testé sur de nombreux conteneurs Alpine Linux fraîchement frappés pour le tester):

git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if ; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

Wrapping up

J’espère que vous trouverez cette technique utile pour suivre votre configuration. Si vous êtes curieux, mes dotfiles se trouvent ici. Aussi s’il vous plaît, restez connecté en suivant @durdn ou mon équipe géniale à @atlassiandev.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.