Dotfiles: il modo migliore per archiviare in un semplice repository Git
Avvertenza: il titolo è leggermente iperbolico, ci sono altre soluzioni comprovate al problema. Penso però che la tecnica qui sotto sia molto elegante.
Recentemente ho letto di questa straordinaria tecnica in un thread di Hacker News sulle soluzioni utilizzate dalle persone per archiviare i propri dotfile. L'utente StreakyCobra
ha mostrato la sua configurazione elegante e... aveva molto senso! Sto iniziando ad applicare questa stessa tecnica al mio sistema. L'unico prerequisito è installare Git.
Nelle sue parole, la tecnica seguente richiede:
Nessuno strumento aggiuntivo, nessun link simbolico, i file vengono tracciati su un sistema di controllo delle versioni, puoi usare branch diversi per computer diversi, puoi replicare facilmente la tua configurazione su una nuova installazione.
La tecnica consiste nell'archiviare un semplice repository Git in una "laterale" (come $HOME/.cfg
o $HOME/.myconfig
) usando un alias appositamente predisposto in modo che i comandi vengano eseguiti su quel repository e non sulla solita cartella locale .git
, che interferirebbe con qualsiasi altro repository Git in circolazione.
Iniziare da zero
Se non hai mai monitorato le tue configurazioni in un repository Git, puoi iniziare a usare questa tecnica facilmente con queste righe:
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 prima riga crea una cartella
~/.cfg
che è un semplice repository Git che terrà traccia dei nostri file. - Quindi creiamo una
configurazione
alias che useremo al posto del normalegit
quando vogliamo interagire con il nostro repository di configurazione. - Abbiamo impostato un flag, locale per il repository, per nascondere i file che non stiamo ancora tracciando esplicitamente. In questo modo quando digiti
config status
e altri comandi in un secondo momento, i file che non ti interessa tracciare non vengano visualizzati comenon tracciati
. - Inoltre, puoi aggiungere manualmente la definizione dell'alias al tuo
.bashrc
o utilizzare la quarta riga fornita per comodità.
Ho impacchettato le righe precedenti in un frammento su Bitbucket e l'ho collegato da un URL breve. Puoi quindi configurare il tutto con:
materiale correlato
Come spostare un repository Git completo
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
curl -Lks http://bit.do/cfg-init | /bin/bash
Dopo aver eseguito l'installazione, qualsiasi file all'interno della cartella $HOME
può essere aggiornato con i normali comandi, sostituendo git
con il tuo alias di configurazione
appena creato, come:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push
Installa i tuoi dotfile su un nuovo sistema (o esegui la migrazione a questa configurazione)
Se archivi già la tua configurazione/dotfile in un repository Git, su un nuovo sistema puoi migrare a questa configurazione con i seguenti passaggi:
- Prima dell'installazione assicurati di aver eseguito il commit dell'alias sul tuo
.bashrc
o.zsh
:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
- E che il tuo repository di origine ignori la cartella in cui lo clonerai, in modo da non creare strani problemi di ricorsione:
echo ".cfg" >> .gitignore
- Ora clona i tuoi dotfile in un semplice repository in una cartella "dot" della tua
$HOME
:
git clone --bare <git-repo-url> $HOME/.cfg
- Definisci l'alias nell'ambito della shell corrente:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
- Esegui il check-out dei contenuti effettivi dal semplice repository al tuo
$HOME
:
config checkout
- Il passaggio precedente potrebbe fallire con un messaggio del tipo:
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
Questo perché la tua cartella $HOME
potrebbe già contenere alcuni file di configurazione stock che verrebbero sovrascritti da Git. La soluzione è semplice: fai il backup dei file se ti interessano, rimuovili in caso contrario. Ti fornisco una possibile scorciatoia approssimativa per spostare automaticamente tutti i file in questione in una cartella di backup:
mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
- Esegui nuovamente il check-out in caso di problemi:
config checkout
- Imposta il flag
showUntrackedFiles
suno
in questo repository specifico (locale):
config config --local status.showUntrackedFiles no
- Hai finito, d'ora in poi puoi digitare i comandi
config
per aggiungere e aggiornare i tuoi dotfile:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push
Ancora una volta, come scorciatoia per non dover ricordare tutti questi passaggi su qualsiasi nuovo computer che desideri configurare, puoi creare un semplice script, archiviarlo come frammento di Bitbucket come ho fatto io, creare un breve URL e chiamarlo così:
curl -Lks http://bit.do/cfg-install | /bin/bash
Per completezza, questo è ciò che ho ottenuto (testato su molti container Alpine Linux appena coniati per testarlo):
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
Conclusione
Spero che questa tecnica sia utile per tenere traccia della tua configurazione. Se sei curioso, i miei dotfile vivono qui. Inoltre, continua a seguire me @durdn o il mio fantastico team @atlassiandev.
Condividi l'articolo
Argomento successivo
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.