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 dugit
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 commeuntracked
. - 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 :
Ressource connexe
Comment déplacer un dépôt Git complet
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
surno
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.