Close

Dotfiles : la meilleure façon de stocker dans un dépôt Git brut

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

J'ai récemment découvert cette technique étonnante dans un fil de discussion de Hacker News sur les solutions des utilisateurs pour stocker leurs dotfiles. L'utilisateur StreakyCobra a montré son élégante installation et... cela avait tellement de sens ! Je suis en train de basculer mon propre système vers la même technique. Le seul prérequis est d'installer Git.

Selon ses propres termes, la technique ci-dessous ne nécessite :

aucun outil supplémentaire ni aucun lien symbolique (symlink). Les fichiers sont suivis sur un système de contrôle de version. Vous pouvez utiliser différentes branches pour différents ordinateurs et vous pouvez facilement répliquer votre configuration sur une nouvelle installation.

La technique consiste à stocker un dépôt Git brut 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 dans ce dépôt et non dans le dossier local .git habituel, ce qui interférerait avec les autres dépôts Git présents.


En partant de rien


Si vous n'avez jamais suivi vos configurations dans un dépôt Git auparavant, vous pouvez facilement commencer à utiliser cette technique 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 brut qui permettra de suivre nos fichiers.
  • Ensuite, nous créons une config d'alias que nous utiliserons à la place du git habituel lorsque nous voulons interagir avec notre dépôt de configuration.
  • Nous avons défini un flag (local vers le dépôt) pour masquer les fichiers que nous ne suivons pas encore explicitement. Ainsi, lorsque vous tapez config status et d'autres commandes plus tard, les fichiers que vous ne souhaitez pas suivre n'apparaîtront pas comme untracked.
  • Vous pouvez également ajouter la définition d'alias manuellement à votre .bashrc ou utiliser la quatrième ligne fournie à des fins pratiques.

J'ai regroupé les lignes ci-dessus dans un snippet sur Bitbucket et je l'ai lié à partir d'une URL courte pour que vous puissiez mettre les choses en place avec :

Bases de données
Ressource connexe

Comment déplacer un dépôt Git complet

Logo Bitbucket
DÉCOUVRIR LA SOLUTION

Découvrir Git avec Bitbucket Cloud

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

Après avoir exécuté l'installation, n'importe quel fichier du dossier $HOME peut être versionné à l'aide de commandes normales, en remplaçant git par l'alias de config que vous venez de créer, comme ci-dessous :

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

Installez vos dotfiles sur un nouveau système (ou migrez vers cette configuration)


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

  • Avant l'installation, assurez-vous d'avoir commité l'alias dans votre fichier .bashrc ou .zsh :
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Et que votre dépôt source ignore le dossier dans lequel vous allez le cloner, afin que vous ne créiez pas de problèmes de récursion étranges :
echo ".cfg" >> .gitignore
  • Clonez maintenant vos dotfiles dans un dépôt brut dans un dossier « dot » de votre dossier $HOME :
git clone --bare <git-repo-url> $HOME/.cfg
  • Définissez l'alias dans le périmètre actuel du shell :
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Faites un check-out du contenu réel du dépôt brut vers votre dossier $HOME :
config checkout
  • L'étape ci-dessus peut échouer avec un message tel que :
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

Cela est dû au fait que votre dossier $HOME peut déjà contenir des fichiers de configuration de stock qui seraient écrasés par Git. La solution est simple : sauvegardez les fichiers si vous y tenez, supprimez-les si vous n'y tenez pas. Je vous fournis un rapide raccourci 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 $1'} | \
xargs -I{} mv {} .config-backup/{}
  • Relancez le check-out en cas de problème :
config checkout
  • Définissez le flag ShowUntrackedFiles sur no sur ce dépôt (local) spécifique :
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 une fois, pour ne pas avoir à mémoriser toutes ces étapes lorsque vous souhaitez configurer sur une nouvelle machine, vous pouvez créer un script simple, le stocker comme snippet Bitbucket comme je l'ai fait, créer une URL courte pour celui-ci et l'appeler comme ceci :

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

Pour être complet, voici ce que j'ai obtenu (testé sur de nombreux conteneurs Alpine Linux fraîchement créés dans cette optique) :

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 [ $? = 0 ]; then
  echo "Checked out config.";
  else
    echo "Backing up pre-existing dot files.";
    config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

Conclusion


J'espère que cette technique vous sera utile pour suivre votre configuration. Si vous êtes curieux, mes dotfiles se trouvent ici. Et si vous souhaitez rester connecté, n'hésitez pas à suivre @durdn ou ma super équipe chez @atlassiandev.


Partager cet article
Thème suivant

Lectures recommandées

Ajoutez ces ressources à vos favoris pour en savoir plus sur les types d'équipes DevOps, ou pour les mises à jour continues de DevOps chez Atlassian.

Des personnes qui collaborent à l'aide d'un mur rempli d'outils

Le blog Bitbucket

Illustration DevOps

Parcours de formation DevOps

Démos Des démos avec des partenaires d'Atlassian

Fonctionnement de Bitbucket Cloud avec Atlassian Open DevOps

Inscrivez-vous à notre newsletter DevOps

Thank you for signing up