Un solo strumento per la gestione: git bare repository.
La gestione dei dotfiles1, al loro aumentare, potrebbe diventare problematica. Innanzitutto è bene avere una copia degli stessi che si possa agilmente ripristinare in caso si debba reinstallare il sistema operativo, operazione che per me avviene fin troppo spesso. Dal momento che il più delle volte si tratta di banalissimi file di testo, ho pensato prendendo spunto da altri molto più bravi di me di utilzzare GIT che è molto efficiente e facilita molto la gestione. Ma come fare per tenere traccia di file nella home directory in cui si trova di tutto? Dopo un primo tentativo provando a gestire chilometrici file .gitignore ho preferito utilizzare i GIT bare repository2. Ecco qui come ho fatto.
Come prima cosa va inizializzato un bare repository di GIT:
$ git init --bare $HOME/.dotfiles
una volta fatto questo si potrà operare sui file con GIT come un qualsiasi repository di codice facendo attenzione a utilizzare al posto del semplice comando git il comando:
$ git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME
Come accorgimento, una volta ripristinati i dotfiles su una nuova installazione preferisco dire a GIT di non continuare a darmi l’avviso riagurdo a file che non sono sotto tracciamento del controllo di versione. Per fare questo è sufficiente dare in comand:
$ git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME config --local status.showUntrackedFiles no
Altra cosa, vista la mia lazzaronaggine, è la creazione di un alias in modo che la shell prependa già i comandi giusti quando lavora sui dotfiles. Per fare questo aggiungo le seguenti righe al mio file di inizializzazione della shaell (io uso ZSH ma la sintassi per le altre shell non è molto diversa):
# Define aliases
alias dotfiles='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
compdef _git dotfiles
In questo modo la mia shell avvierà l’autocompletamento dei parametri anche per l’alias dotfiles e non solo per il comando git.
Su una VPS che possiedo presso Hetzner ho installato un’istanza Gitea per gestire i miei repository GIT. Una volta aggiunto l’alias alla mia shell posso fare in modo di pubblicare il codice sul server remoto:
$ dotfiles add remote origin git@git.miohost.com:utente/dotfiles.git
ATTENZIONE il repository deve essere già creato.
Dopo aver quindi eseguito l’aggiunta e aver committato le modifiche con i comandi:
dotfiles add .zshrc .tmux.conf .config/nvim
dotfiles commit -m "First commit. Initial file add."
sarà possibile pubblicare i commit eseguiti localmente con il comando:
dotfiles push --set-upstream origin main
Dovesse essere necessario reinstallare il sistema mi sono creato due script (uno per la shell Linux e uno per la PowerShell di Microsoft) per ripristinare in maniera agevole il tutto:
git clone --bare <REPOSITORY_URL> .dotfiles
cd $HOME
rm -rf .ssh
git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME checkout os/windows
git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME config --local status.showUntrackedFiles no
#!/bin/sh
if [ $# -eq 0 ]; then
echo "Please specify a branch."
exit 1
fi
git clone --bare <REPOSITORY_URL> .dotfiles
cd $HOME
rm -rf .ssh .gnupg
git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME checkout os/$1
cd $HOME/.ssh
chmod 600 id_rsa id_rsa.pub abaco abaco.pub scaleway scaleway.pub ubuntu-sso.pub ubuntu-sso
cd $HOME
chmod 600 .netrc
git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME config --local status.showUntrackedFiles no
Nello script ho previsto di poter utilizzare branch diversi per diversi sistemi operativi o distribuzioni linux. Se ci sono modifiche di un branch da portare negli altri posso gestire la cosa con dei merge.
sono chiamati così i file il cui nome (solitamente) inizia con il punto presenti nella home directory al cui interno troviamo la configurazione degli applicativi che il nostro utente usa. ↩
A questo indirizzo c’è una spiegazione più esaustiva riguardo a cos’è un bare repository. ↩