Close

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 normale git 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 come non 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:

Database
materiale correlato

Come spostare un repository Git completo

Logo di Bitbucket
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 su no 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.

Le persone collaborano utilizzando una parete piena di strumenti

Blog di Bitbucket

Illustrazione su Devops

Percorso di apprendimento DevOps

Funzione Demo Den per demo con esperti Atlassian

Come Bitbucket Cloud funziona con Atlassian Open DevOps

Iscriviti alla nostra newsletter DevOps

Thank you for signing up